From c5bc370822ba65e8922881fea5b87d431264a701 Mon Sep 17 00:00:00 2001 From: 14bitVoid <14bitvoid@protonmail.com> Date: Sat, 6 May 2017 23:20:19 +0200 Subject: [PATCH 001/379] First layer line width --- resources/definitions/fdmprinter.def.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 99cfede396..4a5211cf1c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -808,6 +808,16 @@ "maximum_value_warning": "2 * machine_nozzle_size", "settable_per_mesh": false, "settable_per_extruder": true + }, + "initial_layer_line_width_factor": + { + "label": "Initial Layer Line Width", + "description": "Factor of the line width on the first layer. Only applies to skin and walls.", + "type": "float", + "unit": "%", + "default_value": 100.0, + "minimum_value": "0.001", + "settable_per_mesh": true } } } From 817de9d39e096c0419e288bb21c230f4bb771bda Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 24 May 2017 17:42:11 +0200 Subject: [PATCH 002/379] Get a list of available themes instead of the hardcoded list --- resources/qml/Preferences/GeneralPage.qml | 6 +++++- resources/themes/cura/theme.json | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index a01abb06ee..3e734f0e53 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -218,7 +218,11 @@ UM.PreferencesPage id: themeList Component.onCompleted: { - append({ text: catalog.i18nc("@item:inlistbox", "Ultimaker"), code: "cura" }) + var themes = UM.Theme.getThemes() + for (var i = 0; i < themes.length; i++) + { + append({ text: themes[i].name.toString(), code: themes[i].id.toString() }); + } } } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 5f0b3656c8..c398cbe165 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -1,4 +1,7 @@ { + "metadata": { + "name": "Ultimaker" + }, "fonts": { "large": { "size": 1.25, From 4244c60665eba488cc7ab08c28b4c8a0ae0f7801 Mon Sep 17 00:00:00 2001 From: Mehmet Sutas Date: Thu, 1 Jun 2017 15:06:26 +0300 Subject: [PATCH 003/379] Update rigid3d_zero2.def.json Updated start_gcode --- resources/definitions/rigid3d_zero2.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/rigid3d_zero2.def.json b/resources/definitions/rigid3d_zero2.def.json index 73b50f0950..2f4475dcec 100644 --- a/resources/definitions/rigid3d_zero2.def.json +++ b/resources/definitions/rigid3d_zero2.def.json @@ -121,7 +121,7 @@ "default_value": "grid" }, "machine_start_gcode": { - "default_value": "G21\nG28 ; Home extruder\nM107 ; Turn off fan\nG91 ; Relative positioning\nG1 Z5 F180;\nG1 X100 Y100 F3000;\nG1 Z-5 F180;\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nG92 E0 ; Reset extruder position\n" + "default_value": "G21\nG28 ; Home extruder\nM420 S1 ; Enable MBL\nM107 ; Turn off fan\nG91 ; Relative positioning\nG1 Z5 F180;\nG1 X30 Y30 F3000;\nG1 Z-5 F180;\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nG92 E0 ; Reset extruder position\n" }, "machine_end_gcode": { "default_value": "G1 X0 Y180 ; Get extruder out of way.\nM107 ; Turn off fan\nG91 ; Relative positioning\nG0 Z20 ; Lift extruder up\nT0\nG1 E-1 ; Reduce filament pressure\nM104 T0 S0 ; Turn extruder heater off\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM140 S0 ; Disable heated bed\nM84 ; Turn steppers off\n" From 88e761e1be7d8a7f52d7a45ea5e7dcb78cf391f9 Mon Sep 17 00:00:00 2001 From: maukcc Date: Fri, 2 Jun 2017 09:41:04 +0200 Subject: [PATCH 004/379] Cartesio acc. and jerk control Added acceleration and jerk control for normal opperation, for special materials, and for multi material jobs. --- resources/definitions/cartesio.def.json | 2 +- .../cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg | 1 - .../cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg | 1 - .../quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg | 4 ++++ .../cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg | 4 ++++ .../quality/cartesio/cartesio_global_High_Quality.inst.cfg | 4 ++++ .../quality/cartesio/cartesio_global_Normal_Quality.inst.cfg | 4 ++++ 7 files changed, 17 insertions(+), 3 deletions(-) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index f14f6572e4..52d32630ff 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -51,7 +51,7 @@ "prime_tower_position_x": { "default_value": 50 }, "prime_tower_position_y": { "default_value": 150 }, "machine_start_gcode": { - "default_value": "\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nM92 E159\n\nG21\nG90\nM42 S255 P13;chamber lights\nM42 S255 P12;fume extraction\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" + "default_value": "\nM92 E159 ;2288 for V5 extruder\n\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nG21\nG90\nM42 S255 P13 ;chamber lights\nM42 S255 P12 ;fume extraction\nM204 S300 ;default acceleration\nM205 X10 ;default jerk\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" }, "machine_end_gcode": { "default_value": "; -- END GCODE --\nM106 S255\nM140 S5\nM104 S5 T0\nM104 S5 T1\nM104 S5 T2\nM104 S5 T3\n\nG91\nG1 Z1 F900\nG90\n\nG1 X20.0 Y260.0 F6000\nG4 S7\nM84\nG4 S90\nM107\nM42 P12 S0\nM42 P13 S0\nM84\nT0\n; -- end of GCODE --" diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg index 03e850c2b0..71b68948f3 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg @@ -45,7 +45,6 @@ speed_equalize_flow_max = =speed_print acceleration_enabled = True acceleration_print = 100 -acceleration_travel = 300 jerk_print = 5 retraction_hop_enabled = True diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg index 9e753261d1..71634cb364 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg @@ -45,7 +45,6 @@ speed_equalize_flow_max = =speed_print acceleration_enabled = True acceleration_print = 100 -acceleration_travel = 300 jerk_print = 5 retraction_hop_enabled = True diff --git a/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg index 6c8b957a96..572c56ee54 100644 --- a/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg @@ -20,6 +20,10 @@ infill_before_walls = False infill_angles = [0,90] speed_slowdown_layers = 1 +acceleration_print = 300 +acceleration_travel = 300 +jerk_print = 10 +jerk_travel = 10 retraction_combing = off diff --git a/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg index 49a484e99d..fcbaa7be70 100644 --- a/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg @@ -20,6 +20,10 @@ infill_before_walls = False infill_angles = [0,90] speed_slowdown_layers = 1 +acceleration_print = 300 +acceleration_travel = 300 +jerk_print = 10 +jerk_travel = 10 retraction_combing = off diff --git a/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg index f16c866284..746711a4ff 100644 --- a/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg @@ -20,6 +20,10 @@ infill_before_walls = False infill_angles = [0,90] speed_slowdown_layers = 1 +acceleration_print = 300 +acceleration_travel = 300 +jerk_print = 10 +jerk_travel = 10 retraction_combing = off diff --git a/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg index d649a7f379..9796092dac 100644 --- a/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg @@ -20,6 +20,10 @@ infill_before_walls = False infill_angles = [0,90] speed_slowdown_layers = 1 +acceleration_print = 300 +acceleration_travel = 300 +jerk_print = 10 +jerk_travel = 10 retraction_combing = off From ade6d45d7c84ee0ad612bf139374b47705b5bf48 Mon Sep 17 00:00:00 2001 From: MaukCC Date: Fri, 2 Jun 2017 09:47:47 +0200 Subject: [PATCH 005/379] Update cartesio_0.4_arnitel2045_normal.inst.cfg --- .../cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg index 71634cb364..4896cfe40a 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg @@ -45,6 +45,7 @@ speed_equalize_flow_max = =speed_print acceleration_enabled = True acceleration_print = 100 +jerk_enabled = True jerk_print = 5 retraction_hop_enabled = True From 2b48311a121912c547004839cbb7aa405bb0d6b8 Mon Sep 17 00:00:00 2001 From: MaukCC Date: Fri, 2 Jun 2017 09:47:59 +0200 Subject: [PATCH 006/379] Update cartesio_0.4_arnitel2045_high.inst.cfg --- .../cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg index 71b68948f3..cf7774445b 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg @@ -45,6 +45,7 @@ speed_equalize_flow_max = =speed_print acceleration_enabled = True acceleration_print = 100 +jerk_enabled = True jerk_print = 5 retraction_hop_enabled = True From de62a3c0feaf1672bf68bef1cc421d9c8a8ff642 Mon Sep 17 00:00:00 2001 From: sheinz Date: Tue, 6 Jun 2017 23:47:40 +0300 Subject: [PATCH 007/379] Fix displaying layers with python3.6 --- cura/LayerDataBuilder.py | 2 +- plugins/LayerView/LayerPass.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py index 2051d3a761..a5da57d42b 100755 --- a/cura/LayerDataBuilder.py +++ b/cura/LayerDataBuilder.py @@ -69,7 +69,7 @@ class LayerDataBuilder(MeshBuilder): vertex_offset = 0 index_offset = 0 - for layer, data in self._layers.items(): + for layer, data in sorted(self._layers.items()): ( vertex_offset, index_offset ) = data.build( vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices) self._element_counts[layer] = data.elementCount diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index b706f21877..51a35fb48a 100755 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -82,12 +82,12 @@ class LayerPass(RenderPass): start = 0 end = 0 element_counts = layer_data.getElementCounts() - for layer, counts in element_counts.items(): + for layer in sorted(element_counts.keys()): if layer > self._layer_view._current_layer_num: break if self._layer_view._minimum_layer_num > layer: - start += counts - end += counts + start += element_counts[layer] + end += element_counts[layer] # This uses glDrawRangeElements internally to only draw a certain range of lines. batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) From e37a3c48f58fe78392fc3fb726c9f3cc24bbbc51 Mon Sep 17 00:00:00 2001 From: Marcos Gomes Date: Wed, 7 Jun 2017 13:28:26 +0100 Subject: [PATCH 008/379] Updated helloBEEprusa printer profiles --- resources/definitions/helloBEEprusa.def.json | 17 +++++++++---- .../extruders/hBp_extruder_left.def.json | 24 ++++++++++++++++++ .../extruders/hBp_extruder_right.def.json | 24 ++++++++++++++++++ .../meshes/BEEVERYCREATIVE-helloBEEprusa.stl | Bin 4 files changed, 60 insertions(+), 5 deletions(-) mode change 100644 => 100755 resources/definitions/helloBEEprusa.def.json create mode 100755 resources/extruders/hBp_extruder_left.def.json create mode 100755 resources/extruders/hBp_extruder_right.def.json mode change 100644 => 100755 resources/meshes/BEEVERYCREATIVE-helloBEEprusa.stl diff --git a/resources/definitions/helloBEEprusa.def.json b/resources/definitions/helloBEEprusa.def.json old mode 100644 new mode 100755 index 90c0fc7e27..5b697d35c7 --- a/resources/definitions/helloBEEprusa.def.json +++ b/resources/definitions/helloBEEprusa.def.json @@ -10,21 +10,28 @@ "category": "Other", "platform": "BEEVERYCREATIVE-helloBEEprusa.stl", "platform_offset": [-226, -75, -196], - "file_formats": "text/x-gcode" + "file_formats": "text/x-gcode", + "machine_extruder_trains": + { + "0": "hBp_extruder_left", + "1": "hBp_extruder_right" + } }, "overrides": { + "machine_extruder_count": { "default_value": 2 }, "machine_name": { "default_value": "hello BEE prusa" }, - "machine_start_gcode": { "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM107 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG92 E0 ;zero the extruded length\nG1 F3600 ;set feedrate to 60 mm/sec\n; -- end of START GCODE --" }, + "machine_start_gcode": { "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM107 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG92 E0 ;zero the extruded length\nG1 F3600 ;set feedrate to 60 mm/sec\nM420 S1 \n; -- end of START GCODE --" }, "machine_end_gcode": { "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nM140 S0 ;set bed temperature to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" }, "machine_width": { "default_value": 185 }, "machine_depth": { "default_value": 200 }, "machine_height": { "default_value": 190 }, "machine_heated_bed": { "default_value": true }, "machine_center_is_zero": { "default_value": false }, - "material_print_temperature": { "default_value": 220 }, + "material_print_temperature": { "default_value": 200 }, "material_bed_temperature": { "default_value": 60 }, "material_diameter": { "default_value": 1.75 }, + "line_width": { "default_value": 0.48 }, "layer_height": { "default_value": 0.2 }, "layer_height_0": { "default_value": 0.2 }, "wall_line_count": { "default_value": 3 }, @@ -44,7 +51,7 @@ "skirt_brim_minimal_length": { "default_value": 30 }, "skirt_gap": { "default_value": 6 }, "cool_fan_full_at_height": { "default_value": 0.4 }, - "retraction_speed": { "default_value": 50.0}, - "retraction_amount": { "default_value": 5.2} + "retraction_speed": { "default_value": 15.0}, + "retraction_amount": { "default_value": 1.5} } } \ No newline at end of file diff --git a/resources/extruders/hBp_extruder_left.def.json b/resources/extruders/hBp_extruder_left.def.json new file mode 100755 index 0000000000..f250ab2d55 --- /dev/null +++ b/resources/extruders/hBp_extruder_left.def.json @@ -0,0 +1,24 @@ +{ + "id": "hBp_extruder_left", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "helloBEEprusa", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, + + + "extruder_prime_pos_x": { "default_value": 0 }, + "extruder_prime_pos_y": { "default_value": 0 }, + "extruder_prime_pos_z": { "default_value": 2 } + } +} diff --git a/resources/extruders/hBp_extruder_right.def.json b/resources/extruders/hBp_extruder_right.def.json new file mode 100755 index 0000000000..aa963cc35b --- /dev/null +++ b/resources/extruders/hBp_extruder_right.def.json @@ -0,0 +1,24 @@ +{ + "id": "hBp_extruder_right", + "version": 2, + "name": "Extruder 2", + "inherits": "fdmextruder", + "metadata": { + "machine": "helloBEEprusa", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, + + + "extruder_prime_pos_x": { "default_value": 185 }, + "extruder_prime_pos_y": { "default_value": 0 }, + "extruder_prime_pos_z": { "default_value": 2 } + } +} diff --git a/resources/meshes/BEEVERYCREATIVE-helloBEEprusa.stl b/resources/meshes/BEEVERYCREATIVE-helloBEEprusa.stl old mode 100644 new mode 100755 From c3dcee7f1499f751125796a50641b3cf120a4a7a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 11 Jun 2017 12:18:16 +0200 Subject: [PATCH 009/379] Update Peopoly Moai definition infill overlap and adhesion type --- resources/definitions/peopoly_moai.def.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json index 9c01ca95e4..4bbb033fb7 100644 --- a/resources/definitions/peopoly_moai.def.json +++ b/resources/definitions/peopoly_moai.def.json @@ -114,6 +114,12 @@ "speed_slowdown_layers": { "value": "2" }, + "infill_overlap": { + "value": "15" + }, + "adhesion_type": { + "value": "\"none\"" + }, "acceleration_enabled": { "value": "False" From 2adf97ba2d84f771a5d8ec02ea9f7cdec7209c7d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 15 Jun 2017 17:18:04 +0200 Subject: [PATCH 010/379] Also apply the filtering on the quality and user profiles model CURA-3935 --- cura/Settings/QualityAndUserProfilesModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index db093126cc..b6ac3fb6d0 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -40,6 +40,6 @@ class QualityAndUserProfilesModel(ProfilesModel): # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] + filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") is None] return quality_list + filtered_quality_changes From e11a52b4ac68713722b8db7764397b9c7189a64b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 16 Jun 2017 12:46:52 +0200 Subject: [PATCH 011/379] Fix infill pattern Since the value is interpreted as Python code, it needs to have an extra set of quotes to be interpreted as a string instead of a variable. Contributes to issue CURA-3907. --- resources/definitions/rigid3d_zero2.def.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/definitions/rigid3d_zero2.def.json b/resources/definitions/rigid3d_zero2.def.json index 6b42e2e29f..ddb98b0eb2 100644 --- a/resources/definitions/rigid3d_zero2.def.json +++ b/resources/definitions/rigid3d_zero2.def.json @@ -64,8 +64,7 @@ "default_value": 15 }, "infill_pattern": { - "default_value": "lines", - "value": "lines" + "value": "'lines'" }, "retraction_amount": { "default_value": 1 From 8c5c28d399ae4dfd668e231c7c2ba7d6f6c4ab07 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 16 Jun 2017 13:23:54 +0200 Subject: [PATCH 012/379] Convert tabs to spaces Contributes to issue CURA-3916. --- resources/definitions/helloBEEprusa.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/helloBEEprusa.def.json b/resources/definitions/helloBEEprusa.def.json index 5b697d35c7..0fee04f2e9 100755 --- a/resources/definitions/helloBEEprusa.def.json +++ b/resources/definitions/helloBEEprusa.def.json @@ -11,7 +11,7 @@ "platform": "BEEVERYCREATIVE-helloBEEprusa.stl", "platform_offset": [-226, -75, -196], "file_formats": "text/x-gcode", - "machine_extruder_trains": + "machine_extruder_trains": { "0": "hBp_extruder_left", "1": "hBp_extruder_right" @@ -19,7 +19,7 @@ }, "overrides": { - "machine_extruder_count": { "default_value": 2 }, + "machine_extruder_count": { "default_value": 2 }, "machine_name": { "default_value": "hello BEE prusa" }, "machine_start_gcode": { "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM107 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG92 E0 ;zero the extruded length\nG1 F3600 ;set feedrate to 60 mm/sec\nM420 S1 \n; -- end of START GCODE --" }, "machine_end_gcode": { "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nM140 S0 ;set bed temperature to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" }, @@ -31,7 +31,7 @@ "material_print_temperature": { "default_value": 200 }, "material_bed_temperature": { "default_value": 60 }, "material_diameter": { "default_value": 1.75 }, - "line_width": { "default_value": 0.48 }, + "line_width": { "default_value": 0.48 }, "layer_height": { "default_value": 0.2 }, "layer_height_0": { "default_value": 0.2 }, "wall_line_count": { "default_value": 3 }, From 694254e299bdccad8c092ab1ade36693ab64007f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 16 Jun 2017 15:54:42 +0200 Subject: [PATCH 013/379] Fix MIME type of material resources Because of this wrong MIME type, the material profile would get saved using the preferred extension of the instance container, .inst.cfg. This would then get interpreted as having the MIME type of instance containers, and then it would fail to load because it is not an INI file. Now it stores it as .xml.fdm_material and so the MIME type database interprets it as an XML file. Contributes to issue CURA-3937. --- plugins/XmlMaterialProfile/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py index d98f2efb3d..f4eb4de8b4 100644 --- a/plugins/XmlMaterialProfile/__init__.py +++ b/plugins/XmlMaterialProfile/__init__.py @@ -51,7 +51,7 @@ def register(app): from UM.VersionUpgradeManager import VersionUpgradeManager VersionUpgradeManager.getInstance().registerCurrentVersion( ("materials", XmlMaterialProfile.XmlMaterialProfile.Version * 1000000 + CuraApplication.SettingVersion), - (CuraApplication.ResourceTypes.MaterialInstanceContainer, "application/x-uranium-instancecontainer") + (CuraApplication.ResourceTypes.MaterialInstanceContainer, "application/x-ultimaker-material-profile") ) return {"version_upgrade": upgrader, From f32eb564de4e07789984b9c6f764b835759be3c3 Mon Sep 17 00:00:00 2001 From: Gregor Riepl Date: Mon, 19 Jun 2017 08:50:54 +0200 Subject: [PATCH 014/379] Remove debian/ from gitignore --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 1db07180c0..3ee62405a2 100644 --- a/.gitignore +++ b/.gitignore @@ -30,9 +30,6 @@ cura.desktop .pydevproject .settings -# Debian packaging -debian* - #Externally located plug-ins. plugins/Doodle3D-cura-plugin plugins/GodMode From 07dc19c2999a9f21d36caf11bd743244f85461a6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 19 Jun 2017 13:24:01 +0200 Subject: [PATCH 015/379] Add a dark theme Based on the work by @rudowinger --- resources/themes/cura-dark/theme.json | 186 ++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 resources/themes/cura-dark/theme.json diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json new file mode 100644 index 0000000000..e561578ae1 --- /dev/null +++ b/resources/themes/cura-dark/theme.json @@ -0,0 +1,186 @@ +{ + "metadata": { + "name": "Dark", + "inherits": "cura" + }, + "colors": { + "sidebar": [83, 83, 83, 255], + "lining": [127, 127, 127, 255], + "viewport_overlay": [66, 66, 66, 255], + + "primary": [12, 169, 227, 255], + "primary_hover": [48, 182, 231, 255], + "primary_text": [83, 83, 83, 255], + "border": [127, 127, 127, 255], + "secondary": [66, 66, 66, 255], + + "text": [255, 255, 255, 255], + "text_detail": [174, 174, 174, 128], + "text_link": [12, 169, 227, 255], + "text_inactive": [174, 174, 174, 255], + "text_hover": [70, 84, 113, 255], + "text_pressed": [12, 169, 227, 255], + "text_reversed": [255, 255, 255, 255], + "text_subtext": [255, 255, 255, 255], + + "error": [255, 140, 0, 255], + + "sidebar_header_bar": [66, 66, 66, 255], + "sidebar_header_active": [83, 83, 83, 255], + "sidebar_header_hover": [83, 83, 83, 255], + "sidebar_header_highlight": [83, 83, 83, 255], + "sidebar_header_highlight_hover": [66, 66, 66, 255], + "sidebar_lining": [66, 66, 66, 255], + + "button": [83, 83, 83, 255], + "button_hover": [83, 83, 83, 255], + "button_active": [32, 166, 219, 255], + "button_active_hover": [12, 169, 227, 255], + "button_text": [255, 255, 255, 255], + "button_disabled": [255, 255, 255, 255], + "button_disabled_text": [70, 84, 113, 255], + + "button_tooltip": [83, 83, 83, 255], + "button_tooltip_border": [255, 255, 255, 255], + "button_tooltip_text": [255, 255, 255, 255], + + "toggle_checked": [255, 255, 255, 255], + "toggle_checked_border": [255, 255, 255, 255], + "toggle_checked_text": [83, 83, 83, 255], + "toggle_unchecked": [83, 83, 83, 255], + "toggle_unchecked_border": [127, 127, 127, 255], + "toggle_unchecked_text": [255, 255, 255, 255], + "toggle_hovered": [83, 83, 83, 255], + "toggle_hovered_border": [32, 166, 219, 255], + "toggle_hovered_text": [255, 255, 255, 255], + "toggle_active": [32, 166, 219, 255], + "toggle_active_border": [32, 166, 219, 255], + "toggle_active_text": [255, 255, 255, 255], + + "tab_checked": [83, 83, 83, 255], + "tab_checked_border": [83, 83, 83, 255], + "tab_checked_text": [255, 255, 255, 255], + "tab_unchecked": [66, 66, 66, 255], + "tab_unchecked_border": [66, 66, 66, 255], + "tab_unchecked_text": [127, 127, 127, 255], + "tab_hovered": [66, 66, 66, 255], + "tab_hovered_border": [66, 66, 66, 255], + "tab_hovered_text": [32, 166, 219, 255], + "tab_active": [83, 83, 83, 255], + "tab_active_border": [83, 83, 83, 255], + "tab_active_text": [255, 255, 255, 255], + "tab_background": [66, 66, 66, 255], + + "action_button": [83, 83, 83, 255], + "action_button_text": [255, 255, 255, 255], + "action_button_border": [127, 127, 127, 255], + "action_button_hovered": [83, 83, 83, 255], + "action_button_hovered_text": [255, 255, 255, 255], + "action_button_hovered_border": [12, 169, 227, 255], + "action_button_active": [12, 169, 227, 255], + "action_button_active_text": [83, 83, 83, 255], + "action_button_active_border": [12, 169, 227, 255], + "action_button_disabled": [66, 66, 66, 255], + "action_button_disabled_text": [127, 127, 127, 255], + "action_button_disabled_border": [66, 66, 66, 255], + + "scrollbar_background": [83, 83, 83, 255], + "scrollbar_handle": [255, 255, 255, 255], + "scrollbar_handle_hover": [12, 159, 227, 255], + "scrollbar_handle_down": [12, 159, 227, 255], + + "setting_category": [66, 66, 66, 255], + "setting_category_disabled": [83, 83, 83, 255], + "setting_category_hover": [66, 66, 66, 255], + "setting_category_active": [66, 66, 66, 255], + "setting_category_active_hover": [66, 66, 66, 255], + "setting_category_text": [255, 255, 255, 255], + "setting_category_border": [66, 66, 66, 255], + "setting_category_disabled_border": [66, 66, 66, 255], + "setting_category_hover_border": [12, 159, 227, 255], + "setting_category_active_border": [66, 66, 66, 255], + "setting_category_active_hover_border": [12, 159, 227, 255], + + "setting_control": [83, 83, 83, 255], + "setting_control_selected": [12, 159, 227, 255], + "setting_control_highlight": [83, 83, 83, 0], + "setting_control_border": [127, 127, 127, 255], + "setting_control_border_highlight": [12, 169, 227, 255], + "setting_control_text": [255, 255, 255, 255], + "setting_control_depth_line": [127, 127, 127, 255], + "setting_control_button": [127, 127, 127, 255], + "setting_control_button_hover": [70, 84, 113, 255], + "setting_control_disabled": [66, 66, 66, 255], + "setting_control_disabled_text": [127, 127, 127, 255], + "setting_control_disabled_border": [127, 127, 127, 255], + "setting_unit": [127, 127, 127, 255], + "setting_validation_error": [255, 57, 14, 255], + "setting_validation_warning": [255, 186, 15, 255], + "setting_validation_ok": [83, 83, 83, 255], + + "progressbar_background": [66, 66, 66, 255], + "progressbar_control": [255, 255, 255, 255], + + "slider_groove": [66, 66, 66, 255], + "slider_groove_border": [127, 127, 127, 255], + "slider_groove_fill": [127, 127, 127, 255], + "slider_handle": [32, 166, 219, 255], + "slider_handle_hover": [77, 182, 226, 255], + "slider_text_background": [83, 83, 83, 255], + + "checkbox": [83, 83, 83, 255], + "checkbox_hover": [83, 83, 83, 255], + "checkbox_border": [127, 127, 127, 255], + "checkbox_border_hover": [12, 169, 227, 255], + "checkbox_mark": [255, 255, 255, 255], + "checkbox_text": [255, 255, 255, 255], + + "mode_switch": [83, 83, 83, 255], + "mode_switch_hover": [83, 83, 83, 255], + "mode_switch_border": [127, 127, 127, 255], + "mode_switch_border_hover": [12, 169, 227, 255], + "mode_switch_handle": [255, 255, 255, 255], + "mode_switch_text": [255, 255, 255, 255], + "mode_switch_text_hover": [255, 255, 255, 255], + "mode_switch_text_checked": [12, 169, 227, 255], + + "tooltip": [12, 169, 227, 255], + "tooltip_text": [255, 255, 255, 255], + + "message_background": [255, 255, 255, 255], + "message_text": [83, 83, 83, 255], + "message_border": [255, 255, 255, 255], + "message_button": [83, 83, 83, 255], + "message_button_hover": [12, 169, 227, 255], + "message_button_active": [32, 166, 219, 255], + "message_button_text": [255, 255, 255, 255], + "message_button_text_hover": [83, 83, 83, 255], + "message_button_text_active": [83, 83, 83, 255], + "message_progressbar_background": [83, 83, 83, 255], + "message_progressbar_control": [12, 169, 227, 255], + + "tool_panel_background": [83, 83, 83, 255], + + "status_offline": [0, 0, 0, 255], + "status_ready": [0, 205, 0, 255], + "status_busy": [12, 169, 227, 255], + "status_paused": [255, 140, 0, 255], + "status_stopped": [236, 82, 80, 255], + "status_unknown": [127, 127, 127, 255], + + "disabled_axis": [127, 127, 127, 255], + "x_axis": [255, 0, 0, 255], + "y_axis": [0, 0, 255, 255], + "z_axis": [0, 255, 0, 255], + "all_axis": [83, 83, 83, 255], + + "viewport_background": [66, 66, 66, 255], + "volume_outline": [12, 169, 227, 255], + "buildplate": [244, 244, 244, 255], + "buildplate_alt": [204, 204, 204, 255], + + "convex_hull": [35, 35, 35, 127], + "disallowed_area": [0, 0, 0, 40], + "error_area": [255, 0, 0, 127] + } +} From 73e951d4023c8d7d9fe86ef73cd807a706f1f1cd Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 19 Jun 2017 15:48:04 +0200 Subject: [PATCH 016/379] Darken buildplate --- resources/themes/cura-dark/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index e561578ae1..559671dfeb 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -176,7 +176,7 @@ "viewport_background": [66, 66, 66, 255], "volume_outline": [12, 169, 227, 255], - "buildplate": [244, 244, 244, 255], + "buildplate": [169, 169, 169, 255], "buildplate_alt": [204, 204, 204, 255], "convex_hull": [35, 35, 35, 127], From fa15a5b5cebe2ae72dae3a4b9eabfcba01465cd0 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 20 Jun 2017 10:29:43 +0100 Subject: [PATCH 017/379] Added z_seam_relative setting to determine whether z seam is relative to part or not. --- resources/definitions/fdmprinter.def.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 46505b8152..c68381af5a 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1166,6 +1166,17 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, + "z_seam_relative": + { + "label": "Z Seam Relative", + "description": "Whether the coordinates of the position near where to start printing each part in a layer are relative to the part's centre. By default, the coordinates define an absolute position on the platform.", + "unit": "mm", + "type": "bool", + "default_value": false, + "enabled": "z_seam_type == 'back'", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, "skin_no_small_gaps_heuristic": { "label": "Ignore Small Z Gaps", From 6dc55a035e6f179c6c31913343e791e0ff2bd799 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 21 Jun 2017 08:08:46 +0100 Subject: [PATCH 018/379] Tweak description of z_seam_relative. --- 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 c68381af5a..b7bc38764f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1169,7 +1169,7 @@ "z_seam_relative": { "label": "Z Seam Relative", - "description": "Whether the coordinates of the position near where to start printing each part in a layer are relative to the part's centre. By default, the coordinates define an absolute position on the platform.", + "description": "When enabled, the z seam coordinates are relative to each part's centre. By default, the coordinates define an absolute position on the platform.", "unit": "mm", "type": "bool", "default_value": false, From 44125d327550c2ffd34b82625eafa34409a964d2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 21 Jun 2017 11:22:35 +0200 Subject: [PATCH 019/379] Moved certain meta data entries to seperate file CURA-3856 & CURA-3712 --- plugins/3MFReader/__init__.py | 10 +--------- plugins/3MFReader/plugin.json | 8 ++++++++ plugins/3MFWriter/__init__.py | 10 +--------- plugins/3MFWriter/plugin.json | 8 ++++++++ plugins/AutoSave/__init__.py | 10 +--------- plugins/AutoSave/plugin.json | 8 ++++++++ plugins/ChangeLogPlugin/__init__.py | 10 +--------- plugins/ChangeLogPlugin/plugin.json | 8 ++++++++ plugins/CuraEngineBackend/__init__.py | 9 +-------- plugins/CuraEngineBackend/plugin.json | 8 ++++++++ plugins/CuraProfileReader/__init__.py | 7 ------- plugins/CuraProfileReader/plugin.json | 8 ++++++++ plugins/CuraProfileWriter/__init__.py | 7 ------- plugins/CuraProfileWriter/plugin.json | 8 ++++++++ plugins/GCodeProfileReader/__init__.py | 7 ------- plugins/GCodeProfileReader/plugin.json | 8 ++++++++ plugins/GCodeReader/__init__.py | 7 ------- plugins/GCodeReader/plugin.json | 8 ++++++++ plugins/GCodeWriter/__init__.py | 8 +------- plugins/GCodeWriter/plugin.json | 8 ++++++++ plugins/ImageReader/__init__.py | 7 ------- plugins/ImageReader/plugin.json | 8 ++++++++ plugins/LayerView/__init__.py | 7 ------- plugins/LayerView/plugin.json | 8 ++++++++ plugins/LegacyProfileReader/__init__.py | 7 ------- plugins/LegacyProfileReader/plugin.json | 8 ++++++++ plugins/MachineSettingsAction/__init__.py | 10 +--------- plugins/MachineSettingsAction/plugin.json | 8 ++++++++ plugins/PerObjectSettingsTool/__init__.py | 7 ------- plugins/PerObjectSettingsTool/plugin.json | 8 ++++++++ plugins/RemovableDriveOutputDevice/__init__.py | 7 ------- plugins/RemovableDriveOutputDevice/plugin.json | 8 ++++++++ plugins/SliceInfoPlugin/__init__.py | 7 ------- plugins/SliceInfoPlugin/plugin.json | 8 ++++++++ plugins/SolidView/__init__.py | 7 ------- plugins/SolidView/plugin.json | 8 ++++++++ plugins/UM3NetworkPrinting/__init__.py | 10 +--------- plugins/UM3NetworkPrinting/plugin.json | 8 ++++++++ plugins/USBPrinting/__init__.py | 8 -------- plugins/USBPrinting/plugin.json | 8 ++++++++ plugins/UltimakerMachineActions/__init__.py | 7 ------- plugins/UltimakerMachineActions/plugin.json | 8 ++++++++ .../VersionUpgrade/VersionUpgrade21to22/__init__.py | 7 ------- .../VersionUpgrade/VersionUpgrade21to22/plugin.json | 8 ++++++++ .../VersionUpgrade/VersionUpgrade22to24/__init__.py | 7 ------- .../VersionUpgrade/VersionUpgrade22to24/plugin.json | 8 ++++++++ .../VersionUpgrade/VersionUpgrade25to26/__init__.py | 7 ------- .../VersionUpgrade/VersionUpgrade25to26/plugin.json | 8 ++++++++ plugins/X3DReader/__init__.py | 7 ------- plugins/X3DReader/plugin.json | 8 ++++++++ plugins/XRayView/__init__.py | 7 ------- plugins/XRayView/plugin.json | 8 ++++++++ plugins/XmlMaterialProfile/__init__.py | 7 ------- plugins/XmlMaterialProfile/plugin.json | 8 ++++++++ 54 files changed, 224 insertions(+), 203 deletions(-) create mode 100644 plugins/3MFReader/plugin.json create mode 100644 plugins/3MFWriter/plugin.json create mode 100644 plugins/AutoSave/plugin.json create mode 100644 plugins/ChangeLogPlugin/plugin.json create mode 100644 plugins/CuraEngineBackend/plugin.json create mode 100644 plugins/CuraProfileReader/plugin.json create mode 100644 plugins/CuraProfileWriter/plugin.json create mode 100644 plugins/GCodeProfileReader/plugin.json create mode 100644 plugins/GCodeReader/plugin.json create mode 100644 plugins/GCodeWriter/plugin.json create mode 100644 plugins/ImageReader/plugin.json create mode 100644 plugins/LayerView/plugin.json create mode 100644 plugins/LegacyProfileReader/plugin.json create mode 100644 plugins/MachineSettingsAction/plugin.json create mode 100644 plugins/PerObjectSettingsTool/plugin.json create mode 100644 plugins/RemovableDriveOutputDevice/plugin.json create mode 100644 plugins/SliceInfoPlugin/plugin.json create mode 100644 plugins/SolidView/plugin.json create mode 100644 plugins/UM3NetworkPrinting/plugin.json create mode 100644 plugins/USBPrinting/plugin.json create mode 100644 plugins/UltimakerMachineActions/plugin.json create mode 100644 plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json create mode 100644 plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json create mode 100644 plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json create mode 100644 plugins/X3DReader/plugin.json create mode 100644 plugins/XRayView/plugin.json create mode 100644 plugins/XmlMaterialProfile/plugin.json diff --git a/plugins/3MFReader/__init__.py b/plugins/3MFReader/__init__.py index 7453c8cb0a..9ed15cf43f 100644 --- a/plugins/3MFReader/__init__.py +++ b/plugins/3MFReader/__init__.py @@ -22,15 +22,7 @@ def getMetaData() -> Dict: else: workspace_extension = "curaproject.3mf" - metaData = { - "plugin": { - "name": catalog.i18nc("@label", "3MF Reader"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides support for reading 3MF files."), - "api": 3 - } - } + metaData = {} if "3MFReader.ThreeMFReader" in sys.modules: metaData["mesh_reader"] = [ { diff --git a/plugins/3MFReader/plugin.json b/plugins/3MFReader/plugin.json new file mode 100644 index 0000000000..fa4578e017 --- /dev/null +++ b/plugins/3MFReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "3MF Reader", + "author": "Ultimaker", + "version": "1.0.0", + "description": "Provides support for reading 3MF files.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/3MFWriter/__init__.py b/plugins/3MFWriter/__init__.py index b811fb41b5..7395e54502 100644 --- a/plugins/3MFWriter/__init__.py +++ b/plugins/3MFWriter/__init__.py @@ -21,15 +21,7 @@ def getMetaData(): else: workspace_extension = "curaproject.3mf" - metaData = { - "plugin": { - "name": i18n_catalog.i18nc("@label", "3MF Writer"), - "author": "Ultimaker", - "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Provides support for writing 3MF files."), - "api": 3 - } - } + metaData = {} if "3MFWriter.ThreeMFWriter" in sys.modules: metaData["mesh_writer"] = { diff --git a/plugins/3MFWriter/plugin.json b/plugins/3MFWriter/plugin.json new file mode 100644 index 0000000000..fea792f904 --- /dev/null +++ b/plugins/3MFWriter/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "3MF Writer", + "author": "Ultimaker", + "version": "1.0.0", + "description": "Provides support for writing 3MF files.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/AutoSave/__init__.py b/plugins/AutoSave/__init__.py index 7e70ebe0a2..dbf39e08cf 100644 --- a/plugins/AutoSave/__init__.py +++ b/plugins/AutoSave/__init__.py @@ -7,15 +7,7 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") def getMetaData(): - return { - "plugin": { - "name": catalog.i18nc("@label", "Auto Save"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Automatically saves Preferences, Machines and Profiles after changes."), - "api": 3 - }, - } + return {} def register(app): return { "extension": AutoSave.AutoSave() } diff --git a/plugins/AutoSave/plugin.json b/plugins/AutoSave/plugin.json new file mode 100644 index 0000000000..f5bf2ba4e1 --- /dev/null +++ b/plugins/AutoSave/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Auto Save", + "author": "Ultimaker", + "version": "1.0.0", + "description": "Automatically saves Preferences, Machines and Profiles after changes.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py index 8466bfaa1b..dbeac8cb2d 100644 --- a/plugins/ChangeLogPlugin/__init__.py +++ b/plugins/ChangeLogPlugin/__init__.py @@ -7,15 +7,7 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") def getMetaData(): - return { - "plugin": { - "name": catalog.i18nc("@label", "Changelog"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Shows changes since latest checked version."), - "api": 3 - } - } + return {} def register(app): return {"extension": ChangeLog.ChangeLog()} diff --git a/plugins/ChangeLogPlugin/plugin.json b/plugins/ChangeLogPlugin/plugin.json new file mode 100644 index 0000000000..d9d5e91679 --- /dev/null +++ b/plugins/ChangeLogPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Changelog", + "author": "Ultimaker", + "version": "1.0.0", + "description": "Shows changes since latest checked version.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/CuraEngineBackend/__init__.py b/plugins/CuraEngineBackend/__init__.py index 2e652ae845..a5269d03cd 100644 --- a/plugins/CuraEngineBackend/__init__.py +++ b/plugins/CuraEngineBackend/__init__.py @@ -8,14 +8,7 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") def getMetaData(): - return { - "plugin": { - "name": catalog.i18nc("@label", "CuraEngine Backend"), - "author": "Ultimaker", - "description": catalog.i18nc("@info:whatsthis", "Provides the link to the CuraEngine slicing backend."), - "api": 3 - } - } + return {} def register(app): return { "backend": CuraEngineBackend.CuraEngineBackend() } diff --git a/plugins/CuraEngineBackend/plugin.json b/plugins/CuraEngineBackend/plugin.json new file mode 100644 index 0000000000..076b0ca88d --- /dev/null +++ b/plugins/CuraEngineBackend/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "CuraEngine Backend", + "author": "Ultimaker", + "description": "Provides the link to the CuraEngine slicing backend.", + "api": 4, + "version": "1.0.0", + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/CuraProfileReader/__init__.py b/plugins/CuraProfileReader/__init__.py index c4206ab763..bbf446fc5f 100644 --- a/plugins/CuraProfileReader/__init__.py +++ b/plugins/CuraProfileReader/__init__.py @@ -8,13 +8,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Cura Profile Reader"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides support for importing Cura profiles."), - "api": 3 - }, "profile_reader": [ { "extension": "curaprofile", diff --git a/plugins/CuraProfileReader/plugin.json b/plugins/CuraProfileReader/plugin.json new file mode 100644 index 0000000000..5614d38e79 --- /dev/null +++ b/plugins/CuraProfileReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Cura Profile Reader", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides support for importing Cura profiles.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/CuraProfileWriter/__init__.py b/plugins/CuraProfileWriter/__init__.py index 30528b8167..244ba580cd 100644 --- a/plugins/CuraProfileWriter/__init__.py +++ b/plugins/CuraProfileWriter/__init__.py @@ -8,13 +8,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Cura Profile Writer"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides support for exporting Cura profiles."), - "api": 3 - }, "profile_writer": [ { "extension": "curaprofile", diff --git a/plugins/CuraProfileWriter/plugin.json b/plugins/CuraProfileWriter/plugin.json new file mode 100644 index 0000000000..e3a5782a12 --- /dev/null +++ b/plugins/CuraProfileWriter/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Cura Profile Writer", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides support for exporting Cura profiles.", + "api": 4, + "catalog":"cura" +} \ No newline at end of file diff --git a/plugins/GCodeProfileReader/__init__.py b/plugins/GCodeProfileReader/__init__.py index 690ef69376..a5912e3cb3 100644 --- a/plugins/GCodeProfileReader/__init__.py +++ b/plugins/GCodeProfileReader/__init__.py @@ -8,13 +8,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "GCode Profile Reader"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from g-code files."), - "api": 3 - }, "profile_reader": [ { "extension": "gcode", diff --git a/plugins/GCodeProfileReader/plugin.json b/plugins/GCodeProfileReader/plugin.json new file mode 100644 index 0000000000..1337d8dfba --- /dev/null +++ b/plugins/GCodeProfileReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "GCode Profile Reader", + "author": "Ultimaker", + "version": "1.0.0", + "description": "Provides support for importing profiles from g-code files.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/GCodeReader/__init__.py b/plugins/GCodeReader/__init__.py index 2ff412e757..7cabeaf5a8 100644 --- a/plugins/GCodeReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -8,13 +8,6 @@ i18n_catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": i18n_catalog.i18nc("@label", "G-code Reader"), - "author": "Victor Larchenko", - "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Allows loading and displaying G-code files."), - "api": 3 - }, "mesh_reader": [ { "extension": "gcode", diff --git a/plugins/GCodeReader/plugin.json b/plugins/GCodeReader/plugin.json new file mode 100644 index 0000000000..89a70cf6b9 --- /dev/null +++ b/plugins/GCodeReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "G-code Reader", + "author": "Victor Larchenko", + "version": "1.0", + "description": "Allows loading and displaying G-code files.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/GCodeWriter/__init__.py b/plugins/GCodeWriter/__init__.py index efe3368c61..904deb1c19 100644 --- a/plugins/GCodeWriter/__init__.py +++ b/plugins/GCodeWriter/__init__.py @@ -8,13 +8,7 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "GCode Writer"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Writes GCode to a file."), - "api": 3 - }, + "mesh_writer": { "output": [{ diff --git a/plugins/GCodeWriter/plugin.json b/plugins/GCodeWriter/plugin.json new file mode 100644 index 0000000000..31fa556b0f --- /dev/null +++ b/plugins/GCodeWriter/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "GCode Writer", + "author": "Ultimaker", + "version": "1.0", + "description": "Writes GCode to a file.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/ImageReader/__init__.py b/plugins/ImageReader/__init__.py index 7ebdc31e57..d1fb77859e 100644 --- a/plugins/ImageReader/__init__.py +++ b/plugins/ImageReader/__init__.py @@ -8,13 +8,6 @@ i18n_catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": i18n_catalog.i18nc("@label", "Image Reader"), - "author": "Ultimaker", - "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Enables ability to generate printable geometry from 2D image files."), - "api": 3 - }, "mesh_reader": [ { "extension": "jpg", diff --git a/plugins/ImageReader/plugin.json b/plugins/ImageReader/plugin.json new file mode 100644 index 0000000000..87b42412b1 --- /dev/null +++ b/plugins/ImageReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Image Reader", + "author": "Ultimaker", + "version": "1.0", + "description": "Enables ability to generate printable geometry from 2D image files.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py index 67750fb562..0f6b43698a 100644 --- a/plugins/LayerView/__init__.py +++ b/plugins/LayerView/__init__.py @@ -9,13 +9,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Layer View"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides the Layer view."), - "api": 3 - }, "view": { "name": catalog.i18nc("@item:inlistbox", "Layers"), "view_panel": "LayerView.qml", diff --git a/plugins/LayerView/plugin.json b/plugins/LayerView/plugin.json new file mode 100644 index 0000000000..6559ed2489 --- /dev/null +++ b/plugins/LayerView/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Layer View", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides the Layer view.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/LegacyProfileReader/__init__.py b/plugins/LegacyProfileReader/__init__.py index f8b1f5c156..10dd298864 100644 --- a/plugins/LegacyProfileReader/__init__.py +++ b/plugins/LegacyProfileReader/__init__.py @@ -8,13 +8,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Legacy Cura Profile Reader"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from legacy Cura versions."), - "api": 3 - }, "profile_reader": [ { "extension": "ini", diff --git a/plugins/LegacyProfileReader/plugin.json b/plugins/LegacyProfileReader/plugin.json new file mode 100644 index 0000000000..d1afd02ae8 --- /dev/null +++ b/plugins/LegacyProfileReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Legacy Cura Profile Reader", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides support for importing profiles from legacy Cura versions.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/MachineSettingsAction/__init__.py b/plugins/MachineSettingsAction/__init__.py index 7d8b253d33..1c4464e9b2 100644 --- a/plugins/MachineSettingsAction/__init__.py +++ b/plugins/MachineSettingsAction/__init__.py @@ -7,15 +7,7 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") def getMetaData(): - return { - "plugin": { - "name": catalog.i18nc("@label", "Machine Settings action"), - "author": "fieldOfView", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides a way to change machine settings (such as build volume, nozzle size, etc)"), - "api": 3 - } - } + return {} def register(app): return { "machine_action": MachineSettingsAction.MachineSettingsAction() } diff --git a/plugins/MachineSettingsAction/plugin.json b/plugins/MachineSettingsAction/plugin.json new file mode 100644 index 0000000000..01d420fecb --- /dev/null +++ b/plugins/MachineSettingsAction/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Machine Settings action", + "author": "fieldOfView", + "version": "1.0.0", + "description": "Provides a way to change machine settings (such as build volume, nozzle size, etc)", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/PerObjectSettingsTool/__init__.py b/plugins/PerObjectSettingsTool/__init__.py index 08b8de1452..eb102fde5d 100644 --- a/plugins/PerObjectSettingsTool/__init__.py +++ b/plugins/PerObjectSettingsTool/__init__.py @@ -10,13 +10,6 @@ i18n_catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": i18n_catalog.i18nc("@label", "Per Model Settings Tool"), - "author": "Ultimaker", - "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Model Settings."), - "api": 3 - }, "tool": { "name": i18n_catalog.i18nc("@label", "Per Model Settings"), "description": i18n_catalog.i18nc("@info:tooltip", "Configure Per Model Settings"), diff --git a/plugins/PerObjectSettingsTool/plugin.json b/plugins/PerObjectSettingsTool/plugin.json new file mode 100644 index 0000000000..6a1d33aafe --- /dev/null +++ b/plugins/PerObjectSettingsTool/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Per Model Settings Tool", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides the Per Model Settings.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/RemovableDriveOutputDevice/__init__.py b/plugins/RemovableDriveOutputDevice/__init__.py index b00214d425..8b46074066 100644 --- a/plugins/RemovableDriveOutputDevice/__init__.py +++ b/plugins/RemovableDriveOutputDevice/__init__.py @@ -8,13 +8,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Removable Drive Output Device Plugin"), - "author": "Ultimaker B.V.", - "description": catalog.i18nc("@info:whatsthis", "Provides removable drive hotplugging and writing support."), - "version": "1.0", - "api": 3 - } } def register(app): diff --git a/plugins/RemovableDriveOutputDevice/plugin.json b/plugins/RemovableDriveOutputDevice/plugin.json new file mode 100644 index 0000000000..5424ce5e34 --- /dev/null +++ b/plugins/RemovableDriveOutputDevice/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Removable Drive Output Device Plugin", + "author": "Ultimaker B.V.", + "description": "Provides removable drive hotplugging and writing support.", + "version": "1.0", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/SliceInfoPlugin/__init__.py b/plugins/SliceInfoPlugin/__init__.py index f6e77fbf22..90ecfcef17 100644 --- a/plugins/SliceInfoPlugin/__init__.py +++ b/plugins/SliceInfoPlugin/__init__.py @@ -6,13 +6,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Slice info"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Submits anonymous slice info. Can be disabled through preferences."), - "api": 3 - } } def register(app): diff --git a/plugins/SliceInfoPlugin/plugin.json b/plugins/SliceInfoPlugin/plugin.json new file mode 100644 index 0000000000..3357214107 --- /dev/null +++ b/plugins/SliceInfoPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Slice info", + "author": "Ultimaker", + "version": "1.0", + "description": "Submits anonymous slice info. Can be disabled through preferences.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/SolidView/__init__.py b/plugins/SolidView/__init__.py index 945ccba8f6..67b15eb617 100644 --- a/plugins/SolidView/__init__.py +++ b/plugins/SolidView/__init__.py @@ -8,13 +8,6 @@ i18n_catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": i18n_catalog.i18nc("@label", "Solid View"), - "author": "Ultimaker", - "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."), - "api": 3 - }, "view": { "name": i18n_catalog.i18nc("@item:inmenu", "Solid"), "weight": 0 diff --git a/plugins/SolidView/plugin.json b/plugins/SolidView/plugin.json new file mode 100644 index 0000000000..e57825cb07 --- /dev/null +++ b/plugins/SolidView/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Solid View", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides a normal solid mesh view.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py index be9f1195ec..667733649b 100644 --- a/plugins/UM3NetworkPrinting/__init__.py +++ b/plugins/UM3NetworkPrinting/__init__.py @@ -6,15 +6,7 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") def getMetaData(): - return { - "plugin": { - "name": "UM3 Network Connection", - "author": "Ultimaker", - "description": catalog.i18nc("@info:whatsthis", "Manages network connections to Ultimaker 3 printers"), - "version": "1.0", - "api": 3 - } - } + return {} def register(app): return { "output_device": NetworkPrinterOutputDevicePlugin.NetworkPrinterOutputDevicePlugin(), "machine_action": DiscoverUM3Action.DiscoverUM3Action()} \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/plugin.json b/plugins/UM3NetworkPrinting/plugin.json new file mode 100644 index 0000000000..e3a061d365 --- /dev/null +++ b/plugins/UM3NetworkPrinting/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "UM3 Network Connection", + "author": "Ultimaker", + "description": "Manages network connections to Ultimaker 3 printers", + "version": "1.0", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py index b8581586d8..990a59fdf3 100644 --- a/plugins/USBPrinting/__init__.py +++ b/plugins/USBPrinting/__init__.py @@ -8,14 +8,6 @@ i18n_catalog = i18nCatalog("cura") def getMetaData(): return { - "type": "extension", - "plugin": { - "name": i18n_catalog.i18nc("@label", "USB printing"), - "author": "Ultimaker", - "version": "1.0", - "api": 3, - "description": i18n_catalog.i18nc("@info:whatsthis","Accepts G-Code and sends them to a printer. Plugin can also update firmware.") - } } def register(app): diff --git a/plugins/USBPrinting/plugin.json b/plugins/USBPrinting/plugin.json new file mode 100644 index 0000000000..2e6e2da808 --- /dev/null +++ b/plugins/USBPrinting/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "USB printing", + "author": "Ultimaker", + "version": "1.0", + "api": 4, + "description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.", + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py index 996026ace2..33b85387a4 100644 --- a/plugins/UltimakerMachineActions/__init__.py +++ b/plugins/UltimakerMachineActions/__init__.py @@ -12,13 +12,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Ultimaker machine actions"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)"), - "api": 3 - } } def register(app): diff --git a/plugins/UltimakerMachineActions/plugin.json b/plugins/UltimakerMachineActions/plugin.json new file mode 100644 index 0000000000..bb1af4ed8d --- /dev/null +++ b/plugins/UltimakerMachineActions/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Ultimaker machine actions", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py b/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py index 74d74e61ae..b153bcf3ce 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py @@ -10,13 +10,6 @@ upgrade = VersionUpgrade21to22.VersionUpgrade21to22() def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Version Upgrade 2.1 to 2.2"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Upgrades configurations from Cura 2.1 to Cura 2.2."), - "api": 3 - }, "version_upgrade": { # From To Upgrade function ("profile", 1000000): ("quality", 2000000, upgrade.upgradeProfile), diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json new file mode 100644 index 0000000000..dab8be0ec4 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Version Upgrade 2.1 to 2.2", + "author": "Ultimaker", + "version": "1.0", + "description": "Upgrades configurations from Cura 2.1 to Cura 2.2.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py index 0ff121f35e..d7ac4ef452 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py @@ -10,13 +10,6 @@ upgrade = VersionUpgrade.VersionUpgrade22to24() def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Version Upgrade 2.2 to 2.4"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Upgrades configurations from Cura 2.2 to Cura 2.4."), - "api": 3 - }, "version_upgrade": { # From To Upgrade function ("machine_instance", 2000000): ("machine_stack", 3000000, upgrade.upgradeMachineInstance), diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json new file mode 100644 index 0000000000..f94d81049a --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Version Upgrade 2.2 to 2.4", + "author": "Ultimaker", + "version": "1.0", + "description": "Upgrades configurations from Cura 2.2 to Cura 2.4.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py b/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py index 5ff589c4e3..a3d2b274da 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py @@ -10,13 +10,6 @@ upgrade = VersionUpgrade25to26.VersionUpgrade25to26() def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Version Upgrade 2.5 to 2.6"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Upgrades configurations from Cura 2.5 to Cura 2.6."), - "api": 3 - }, "version_upgrade": { # From To Upgrade function ("preferences", 4000000): ("preferences", 4000001, upgrade.upgradePreferences), diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json new file mode 100644 index 0000000000..180a2bb056 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json @@ -0,0 +1,8 @@ + { + "name": "Version Upgrade 2.5 to 2.6", + "author": "Ultimaker", + "version": "1.0", + "description": "Upgrades configurations from Cura 2.5 to Cura 2.6.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/X3DReader/__init__.py b/plugins/X3DReader/__init__.py index 84922f627f..9e0e2df91c 100644 --- a/plugins/X3DReader/__init__.py +++ b/plugins/X3DReader/__init__.py @@ -7,13 +7,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "X3D Reader"), - "author": "Seva Alekseyev", - "version": "0.5", - "description": catalog.i18nc("@info:whatsthis", "Provides support for reading X3D files."), - "api": 3 - }, "mesh_reader": [ { "extension": "x3d", diff --git a/plugins/X3DReader/plugin.json b/plugins/X3DReader/plugin.json new file mode 100644 index 0000000000..7ada28e19d --- /dev/null +++ b/plugins/X3DReader/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "X3D Reader", + "author": "Seva Alekseyev", + "version": "0.5", + "description": "Provides support for reading X3D files.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/XRayView/__init__.py b/plugins/XRayView/__init__.py index 34e4761863..e726001216 100644 --- a/plugins/XRayView/__init__.py +++ b/plugins/XRayView/__init__.py @@ -8,13 +8,6 @@ catalog = i18nCatalog("cura") def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "X-Ray View"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."), - "api": 3 - }, "view": { "name": catalog.i18nc("@item:inlistbox", "X-Ray"), "weight": 1 diff --git a/plugins/XRayView/plugin.json b/plugins/XRayView/plugin.json new file mode 100644 index 0000000000..a8afba4635 --- /dev/null +++ b/plugins/XRayView/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "X-Ray View", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides the X-Ray view.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py index f4eb4de8b4..63ec979fbd 100644 --- a/plugins/XmlMaterialProfile/__init__.py +++ b/plugins/XmlMaterialProfile/__init__.py @@ -14,13 +14,6 @@ upgrader = XmlMaterialUpgrader.XmlMaterialUpgrader() def getMetaData(): return { - "plugin": { - "name": catalog.i18nc("@label", "Material Profiles"), - "author": "Ultimaker", - "version": "1.0", - "description": catalog.i18nc("@info:whatsthis", "Provides capabilities to read and write XML-based material profiles."), - "api": 3 - }, "settings_container": { "type": "material", "mimetype": "application/x-ultimaker-material-profile" diff --git a/plugins/XmlMaterialProfile/plugin.json b/plugins/XmlMaterialProfile/plugin.json new file mode 100644 index 0000000000..822dd4071f --- /dev/null +++ b/plugins/XmlMaterialProfile/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Material Profiles", + "author": "Ultimaker", + "version": "1.0", + "description": "Provides capabilities to read and write XML-based material profiles.", + "api": 4, + "catalog": "cura" +} \ No newline at end of file From 1e0b82829b90511dd3c80b88805f6d285601918f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 21 Jun 2017 11:27:25 +0200 Subject: [PATCH 020/379] Update Japanese translation This translation is only translating the setting descriptions. However it is also missing one translation: smooth spiralized contours. We decided not to block these translations just for that one. It was also missing another translation: Support bottom pattern. I inferred that from the description of Support Roof Pattern, basically doing the translation myself. Contributes to issue CURA-3950. --- resources/i18n/jp/fdmextruder.def.json.po | 49 +++--- resources/i18n/jp/fdmprinter.def.json.po | 172 +++++++++++----------- 2 files changed, 112 insertions(+), 109 deletions(-) diff --git a/resources/i18n/jp/fdmextruder.def.json.po b/resources/i18n/jp/fdmextruder.def.json.po index 6d9b5b348b..a6dc6e2e54 100644 --- a/resources/i18n/jp/fdmextruder.def.json.po +++ b/resources/i18n/jp/fdmextruder.def.json.po @@ -8,65 +8,66 @@ msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-03-27 17:27+0000\n" +"PO-Revision-Date: 2017-06-19 15:44+0900\n" "Last-Translator: None\n" "Language-Team: None\n" -"Language: Japanese\n" +"Language: ja\n" "Lang-Code: ja\n" "Country-Code: JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" #: fdmextruder.def.json msgctxt "machine_settings label" msgid "Machine" -msgstr "" +msgstr "プリンター" #: fdmextruder.def.json msgctxt "machine_settings description" msgid "Machine specific settings" -msgstr "" +msgstr "プリンター詳細設定" #: fdmextruder.def.json msgctxt "extruder_nr label" msgid "Extruder" -msgstr "" +msgstr "エクストルーダー" #: fdmextruder.def.json msgctxt "extruder_nr description" msgid "The extruder train used for printing. This is used in multi-extrusion." -msgstr "" +msgstr "エクストルーダーの列。デュアルノズル印刷時に使用。" #: fdmextruder.def.json msgctxt "machine_nozzle_size label" msgid "Nozzle Diameter" -msgstr "" +msgstr "ノズル径" #: fdmextruder.def.json msgctxt "machine_nozzle_size description" msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." -msgstr "" +msgstr "ノズルの内径。規格外のノズルを使用する際は設定を変更してください。" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x label" msgid "Nozzle X Offset" -msgstr "" +msgstr "Xノズルオフセット" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x description" msgid "The x-coordinate of the offset of the nozzle." -msgstr "" +msgstr "ノズルのX軸のオフセット" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y label" msgid "Nozzle Y Offset" -msgstr "" +msgstr "Yノズルオフセット" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y description" msgid "The y-coordinate of the offset of the nozzle." -msgstr "" +msgstr "ノズルのY軸のオフセット" #: fdmextruder.def.json msgctxt "machine_extruder_start_code label" @@ -76,7 +77,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_start_code description" msgid "Start g-code to execute whenever turning the extruder on." -msgstr "" +msgstr "エクストルーダーを使う度にGコードを展開します。" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_abs label" @@ -86,7 +87,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_abs description" msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head." -msgstr "" +msgstr "ヘッドの最後の既知位置からではなく、エクストルーダーのスタート位置を絶対位置にします。" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x label" @@ -96,7 +97,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x description" msgid "The x-coordinate of the starting position when turning the extruder on." -msgstr "" +msgstr "エクストルーダーのX座標のスタート位置" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y label" @@ -106,7 +107,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y description" msgid "The y-coordinate of the starting position when turning the extruder on." -msgstr "" +msgstr "エクストルーダーのY座標のスタート位置" #: fdmextruder.def.json msgctxt "machine_extruder_end_code label" @@ -116,7 +117,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_end_code description" msgid "End g-code to execute whenever turning the extruder off." -msgstr "" +msgstr "エクストルーダーを使用しないときにGコードを終了します。" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_abs label" @@ -126,7 +127,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_abs description" msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head." -msgstr "" +msgstr "ヘッドの既存の認識位置よりもエクストルーダーの最終位置を絶対位置とする。" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x label" @@ -136,7 +137,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x description" msgid "The x-coordinate of the ending position when turning the extruder off." -msgstr "" +msgstr "エクストルーダーを切った際のX座標の最終位置" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y label" @@ -146,7 +147,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y description" msgid "The y-coordinate of the ending position when turning the extruder off." -msgstr "" +msgstr "エクストルーダーを切った際のY座標の最終位置" #: fdmextruder.def.json msgctxt "extruder_prime_pos_z label" @@ -156,7 +157,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "extruder_prime_pos_z description" msgid "The Z coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "印刷開始時にノズルがポジションを確認するZ座標。" #: fdmextruder.def.json msgctxt "platform_adhesion label" @@ -166,7 +167,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "platform_adhesion description" msgid "Adhesion" -msgstr "" +msgstr "密着" #: fdmextruder.def.json msgctxt "extruder_prime_pos_x label" @@ -176,7 +177,7 @@ msgstr "" #: fdmextruder.def.json msgctxt "extruder_prime_pos_x description" msgid "The X coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "印刷開始時にノズルがポジションを確認するX座標。" #: fdmextruder.def.json msgctxt "extruder_prime_pos_y label" @@ -186,4 +187,4 @@ msgstr "" #: fdmextruder.def.json msgctxt "extruder_prime_pos_y description" msgid "The Y coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "印刷開始時にノズルがポジションを確認するY座標。" diff --git a/resources/i18n/jp/fdmprinter.def.json.po b/resources/i18n/jp/fdmprinter.def.json.po index 06b60a76c4..333075b2e2 100644 --- a/resources/i18n/jp/fdmprinter.def.json.po +++ b/resources/i18n/jp/fdmprinter.def.json.po @@ -8,64 +8,66 @@ msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-03-27 17:27+0000\n" +"PO-Revision-Date: 2017-06-19 15:44+0900\n" "Last-Translator: None\n" "Language-Team: None\n" -"Language: Japanese\n" +"Language: ja\n" "Lang-Code: ja\n" "Country-Code: JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.0.1\n" +"X-Generator: Poedit 2.0.2\n" #: fdmprinter.def.json msgctxt "machine_settings label" msgid "Machine" -msgstr "Machine" +msgstr "プリンター" #: fdmprinter.def.json msgctxt "machine_settings description" msgid "Machine specific settings" -msgstr "マシーン固有設定" +msgstr "プリンター詳細設定" #: fdmprinter.def.json msgctxt "machine_name label" msgid "Machine Type" -msgstr "Machine Type" +msgstr "プリンタータイプ" #: fdmprinter.def.json msgctxt "machine_name description" msgid "The name of your 3D printer model." -msgstr "3Dプリンタのモデル" +msgstr "3Dプリンターの機種名" #: fdmprinter.def.json msgctxt "machine_show_variants label" msgid "Show machine variants" -msgstr "Show machine variants" +msgstr "プリンターのバリエーションを表示する" #: fdmprinter.def.json msgctxt "machine_show_variants description" msgid "Whether to show the different variants of this machine, which are described in separate json files." -msgstr "このマシーンの形式を表示するかどうかは、別のjsonファイルに記述されています。" +msgstr "このプリンターのバリエーションを表示するかどうかは、別のjsonファイルに記述されています。" #: fdmprinter.def.json msgctxt "machine_start_gcode label" msgid "Start GCode" -msgstr "Start GCode" +msgstr "GCodeを開始する" #: fdmprinter.def.json msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "開始時に実行されるGcodeのコマンドは −で区切られています。" +msgstr "" +"Gcodeのコマンドは −で始まり\n" +"で区切られます。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" msgid "End GCode" -msgstr "End GCode" +msgstr "GCodeを終了する" #: fdmprinter.def.json msgctxt "machine_end_gcode description" @@ -73,13 +75,13 @@ msgid "" "Gcode commands to be executed at the very end - separated by \n" "." msgstr "" -"開始時に実行されるGcodeのコマンドは \n" -"で区切られています。" +"Gcodeのコマンドは −で始まり\n" +"で区切られます。" #: fdmprinter.def.json msgctxt "material_guid label" msgid "Material GUID" -msgstr "Material GUID" +msgstr "マテリアルGUID" #: fdmprinter.def.json msgctxt "material_guid description" @@ -89,7 +91,7 @@ msgstr "マテリアルのGUID。これは自動的に設定されます。" #: fdmprinter.def.json msgctxt "material_bed_temp_wait label" msgid "Wait for build plate heatup" -msgstr "Wait for build plate heatup" +msgstr "ビルドプレート加熱時の待機" #: fdmprinter.def.json msgctxt "material_bed_temp_wait description" @@ -99,7 +101,7 @@ msgstr "開始時にビルドプレートが温度に達するまで待つコマ #: fdmprinter.def.json msgctxt "material_print_temp_wait label" msgid "Wait for nozzle heatup" -msgstr "Wait for nozzle heatup" +msgstr "ノズル加熱時の待機" #: fdmprinter.def.json msgctxt "material_print_temp_wait description" @@ -109,27 +111,27 @@ msgstr "開始時にノズルの温度が達するまで待つかどうか。" #: fdmprinter.def.json msgctxt "material_print_temp_prepend label" msgid "Include material temperatures" -msgstr "Include material temperatures" +msgstr "ノズル温度設定の挿入" #: fdmprinter.def.json msgctxt "material_print_temp_prepend description" msgid "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting." -msgstr "gcodeの開始時にノズル温度設定を含めるかどうか。 既に最初のgcodeにノズル温度設定が含まれている場合、Curaフロントエンドは自動的にこの設定を無効にします。" +msgstr "GCodeの開始時にノズル温度設定を含めるかどうか。 既に最初のGCodeにノズル温度設定が含まれている場合、Curaフロントエンドは自動的にこの設定を無効にします。" #: fdmprinter.def.json msgctxt "material_bed_temp_prepend label" msgid "Include build plate temperature" -msgstr "Include build plate temperature" +msgstr "ビルドプレート温度設定の挿入" #: fdmprinter.def.json msgctxt "material_bed_temp_prepend description" msgid "Whether to include build plate temperature commands at the start of the gcode. When the start_gcode already contains build plate temperature commands Cura frontend will automatically disable this setting." -msgstr "gcodeの開始時にビルドプレート温度設定を含めるかどうか。 既に最初のgcodeにビルドプレート温度設定が含まれている場合、Curaフロントエンドは自動的にこの設定を無効にします。" +msgstr "GCodeの開始時にビルドプレート温度設定を含めるかどうか。 既に最初のGCodeにビルドプレート温度設定が含まれている場合、Curaフロントエンドは自動的にこの設定を無効にします。" #: fdmprinter.def.json msgctxt "machine_width label" msgid "Machine width" -msgstr "Machine width" +msgstr "造形サイズ(X)" #: fdmprinter.def.json msgctxt "machine_width description" @@ -139,57 +141,57 @@ msgstr "造形可能領域の幅(X方向)。" #: fdmprinter.def.json msgctxt "machine_depth label" msgid "Machine depth" -msgstr "Machine depth" +msgstr "造形サイズ(Y)" #: fdmprinter.def.json msgctxt "machine_depth description" msgid "The depth (Y-direction) of the printable area." -msgstr "造形可能領域の幅(X方向)。" +msgstr "造形可能領域の幅(Y方向)。" #: fdmprinter.def.json msgctxt "machine_shape label" msgid "Build plate shape" -msgstr "Build plate shape" +msgstr "ビルドプレートの形" #: fdmprinter.def.json msgctxt "machine_shape description" msgid "The shape of the build plate without taking unprintable areas into account." -msgstr "造形不能領域を考慮しないビルドプレートの形状。" +msgstr "造形不可領域を考慮しないビルドプレートの形状。" #: fdmprinter.def.json msgctxt "machine_shape option rectangular" msgid "Rectangular" -msgstr "Rectangular" +msgstr "長方形" #: fdmprinter.def.json msgctxt "machine_shape option elliptic" msgid "Elliptic" -msgstr "Elliptic" +msgstr "楕円形" #: fdmprinter.def.json msgctxt "machine_height label" msgid "Machine height" -msgstr "Machine height" +msgstr "造形サイズ(Z)" #: fdmprinter.def.json msgctxt "machine_height description" msgid "The height (Z-direction) of the printable area." -msgstr "造形可能領域の幅(X方向)。" +msgstr "造形可能領域の幅(Z方向)。" #: fdmprinter.def.json msgctxt "machine_heated_bed label" msgid "Has heated build plate" -msgstr "Has heated build plate" +msgstr "ヒートベッドの有無" #: fdmprinter.def.json msgctxt "machine_heated_bed description" msgid "Whether the machine has a heated build plate present." -msgstr "マシーンに加熱式ビルドプレートが付属しているかどうか。" +msgstr "プリンターに加熱式ビルドプレートが付属しているかどうか。" #: fdmprinter.def.json msgctxt "machine_center_is_zero label" msgid "Is center origin" -msgstr "Is center origin" +msgstr "原点" #: fdmprinter.def.json msgctxt "machine_center_is_zero description" @@ -199,17 +201,17 @@ msgstr "プリンタのゼロポジションのX / Y座標が印刷可能領域 #: fdmprinter.def.json msgctxt "machine_extruder_count label" msgid "Number of Extruders" -msgstr "Number of Extruders" +msgstr "エクストルーダーの数" #: fdmprinter.def.json msgctxt "machine_extruder_count description" msgid "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle." -msgstr "エクストルーダーの数。エクストルーダーの数は、フィーダー、ボーデンチューブ、およびノズルの組合せである。" +msgstr "エクストルーダーの数。エクストルーダーの単位は、フィーダー、ボーデンチューブ、およびノズルを組合せたもの。" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter label" msgid "Outer nozzle diameter" -msgstr "Outer nozzle diameter" +msgstr "ノズル外径" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter description" @@ -219,7 +221,7 @@ msgstr "ノズルの外径。" #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance label" msgid "Nozzle length" -msgstr "Nozzle length" +msgstr "ノズルの長さ" #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance description" @@ -229,17 +231,17 @@ msgstr "ノズル先端とプリントヘッドの最下部との高さの差。 #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle label" msgid "Nozzle angle" -msgstr "Nozzle angle" +msgstr "ノズル角度" #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle description" msgid "The angle between the horizontal plane and the conical part right above the tip of the nozzle." -msgstr "水平面とノズルの真上の円錐部分との間の角度。" +msgstr "水平面とノズル直上の円錐部分との間の角度。" #: fdmprinter.def.json msgctxt "machine_heat_zone_length label" msgid "Heat zone length" -msgstr "Heat zone length" +msgstr "加熱範囲" #: fdmprinter.def.json msgctxt "machine_heat_zone_length description" @@ -684,7 +686,7 @@ msgstr "Support Interface Line Width" #: fdmprinter.def.json msgctxt "support_interface_line_width description" msgid "Width of a single line of support roof or floor." -msgstr "" +msgstr "サポートの屋根、フロアのライン幅" #: fdmprinter.def.json msgctxt "support_roof_line_width label" @@ -694,7 +696,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_line_width description" msgid "Width of a single support roof line." -msgstr "" +msgstr "天井のサポートのライン幅。" #: fdmprinter.def.json msgctxt "support_bottom_line_width label" @@ -704,7 +706,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_line_width description" msgid "Width of a single support floor line." -msgstr "" +msgstr "サポートの底面のラインの幅。" #: fdmprinter.def.json msgctxt "prime_tower_line_width label" @@ -1001,7 +1003,7 @@ msgstr "Z Seam Y" #: fdmprinter.def.json msgctxt "z_seam_y description" msgid "The Y coordinate of the position near where to start printing each part in a layer." -msgstr "The Y coordinate of the position near where to start printing each part in a layer." +msgstr "レイヤー内の各パーツの印刷を開始する場所の近くのY座標。" #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic label" @@ -1116,7 +1118,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled description" msgid "Print the infill every so often, so that the filament will curl up chaotically inside the object. This reduces print time, but the behaviour is rather unpredictable." -msgstr "" +msgstr "時々インフィルを印刷してください、オブジェクト内でフィラメントがぐちゃぐちゃに巻き上がります。印刷時間は短縮できるが、フィラメントの動きは予想不可能となります。" #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle label" @@ -1126,7 +1128,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle description" msgid "The maximum angle w.r.t. the Z axis of the inside of the print for areas which are to be filled with spaghetti infill afterwards. Lowering this value causes more angled parts in your model to be filled on each layer." -msgstr "" +msgstr "最大角度 w.r.t.-印刷範囲内がスパゲッティ・インフィルで埋まるZ軸。この値を下げることでモデルの斜め部分にインフィルが各レイヤーに付着します。" #: fdmprinter.def.json msgctxt "spaghetti_max_height label" @@ -1136,7 +1138,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_max_height description" msgid "The maximum height of inside space which can be combined and filled from the top." -msgstr "" +msgstr "内部空間の上から結合して埋め込むことができる最大の高さ" #: fdmprinter.def.json msgctxt "spaghetti_inset label" @@ -1146,7 +1148,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_inset description" msgid "The offset from the walls from where the spaghetti infill will be printed." -msgstr "" +msgstr "スパゲッティ・インフィルがプリントされる壁からのオフセット。" #: fdmprinter.def.json msgctxt "spaghetti_flow label" @@ -1156,7 +1158,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_flow description" msgid "Adjusts the density of the spaghetti infill. Note that the Infill Density only controls the line spacing of the filling pattern, not the amount of extrusion for spaghetti infill." -msgstr "" +msgstr "スパゲッティ・インフィルの密度を調整します。インフィルの密度は、行間枠のパターンを決めるだけで、スパゲッティ・インフィルの押出量は制御しないことにご注意ください。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1288,7 +1290,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "expand_upper_skins description" msgid "Expand the top skin areas (areas with air above) so that they support infill above." -msgstr "" +msgstr "インフィルをトップの面部分 (空気に触れる領域) を広げることで、上のインフィルを支えます。" #: fdmprinter.def.json msgctxt "expand_lower_skins label" @@ -1298,7 +1300,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "expand_lower_skins description" msgid "Expand the bottom skin areas (areas with air below) so that they are anchored by the infill layers above and below." -msgstr "" +msgstr "下面(下に空気がある領域)を拡大して、上と下のインフィルによって支えるようにします。" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance label" @@ -1711,7 +1713,7 @@ msgstr "Support Interface Speed" #: fdmprinter.def.json msgctxt "speed_support_interface description" msgid "The speed at which the roofs and floors of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "" +msgstr "天井と底面のサポート材をプリントする速度。低速でプリントするとオーバーハングの品質を向上できます。" #: fdmprinter.def.json msgctxt "speed_support_roof label" @@ -1721,7 +1723,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_roof description" msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "" +msgstr "天井と底面のサポート材をプリントする速度 これらを低速でプリントするとオーバーハングの品質を向上できます" #: fdmprinter.def.json msgctxt "speed_support_bottom label" @@ -1731,7 +1733,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_bottom description" msgid "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model." -msgstr "" +msgstr "底面のサポートがプリントされる速度。低速で印刷することで、サポートの接着性を向上させることができます。" #: fdmprinter.def.json msgctxt "speed_prime_tower label" @@ -1931,7 +1933,7 @@ msgstr "Support Interface Acceleration" #: fdmprinter.def.json msgctxt "acceleration_support_interface description" msgid "The acceleration with which the roofs and floors of support are printed. Printing them at lower acceleration can improve overhang quality." -msgstr "" +msgstr "サポートの上面と下面が印刷される加速度。低加速度で印刷するとオーバーハングの品質が向上します" #: fdmprinter.def.json msgctxt "acceleration_support_roof label" @@ -1941,7 +1943,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_roof description" msgid "The acceleration with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality." -msgstr "" +msgstr "サポートの上面がプリントされる加速度、低加速度で印刷するとオーバーハングの品質が向上します。" #: fdmprinter.def.json msgctxt "acceleration_support_bottom label" @@ -1951,7 +1953,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_bottom description" msgid "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model." -msgstr "" +msgstr "サポートの底面が印刷される加速度。より低い加速度で印刷すると、モデル上のサポートの接着性を向上させることができます。" #: fdmprinter.def.json msgctxt "acceleration_prime_tower label" @@ -2111,7 +2113,7 @@ msgstr "Support Interface Jerk" #: fdmprinter.def.json msgctxt "jerk_support_interface description" msgid "The maximum instantaneous velocity change with which the roofs and floors of support are printed." -msgstr "" +msgstr "どの天井と底面のサポート部分を印刷するかによって最大瞬間速度は変化します。" #: fdmprinter.def.json msgctxt "jerk_support_roof label" @@ -2121,7 +2123,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_roof description" msgid "The maximum instantaneous velocity change with which the roofs of support are printed." -msgstr "" +msgstr "どのサポートの屋根部分を印刷するかによって最大瞬間速度は変化します。" #: fdmprinter.def.json msgctxt "jerk_support_bottom label" @@ -2131,7 +2133,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" msgid "The maximum instantaneous velocity change with which the floors of support are printed." -msgstr "" +msgstr "どのサポートの底面部分を印刷するかによって最大瞬間速度は変化します。" #: fdmprinter.def.json msgctxt "jerk_prime_tower label" @@ -2469,7 +2471,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_enable description" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." -msgstr "" +msgstr "オーバーハングするモデルのサポートパーツの構造を形成します。これらのサポートがなければ、印刷は失敗します。" #: fdmprinter.def.json msgctxt "support_extruder_nr label" @@ -2509,7 +2511,7 @@ msgstr "Support Interface Extruder" #: fdmprinter.def.json msgctxt "support_interface_extruder_nr description" msgid "The extruder train to use for printing the roofs and floors of the support. This is used in multi-extrusion." -msgstr "" +msgstr "サポートの天井および底面を印刷するために使用するエクストルーダーの列。デュアルノズル時に使用されます。" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr label" @@ -2519,7 +2521,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr description" msgid "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion." -msgstr "" +msgstr "サポートの天井面をプリントする際のエクストルーダー列。デュアルノズル時に使用します。" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr label" @@ -2529,7 +2531,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr description" msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion." -msgstr "" +msgstr "サポートの底面をプリントする際に使用するエクストルーダーの列。デュアルノズル時に使用します。" #: fdmprinter.def.json msgctxt "support_type label" @@ -2709,7 +2711,7 @@ msgstr "Support Stair Step Height" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height description" msgid "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures. Set to zero to turn off the stair-like behaviour." -msgstr "" +msgstr "モデルにのっている階段状のサポートの底のステップの高さ。値を小さくするとサポートを除去するのが困難になりますが、値が大きすぎるとサポートの構造が不安定になる可能性があります。ゼロに設定すると、階段状の動作をオフにします。" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width label" @@ -2719,7 +2721,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width description" msgid "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures." -msgstr "" +msgstr "モデルにのっている階段のような下部のサポートのステップの最大幅。低い値にするサポートの除去が困難になり、高すぎる値は不安定なサポート構造につながります。" #: fdmprinter.def.json msgctxt "support_join_distance label" @@ -2759,7 +2761,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_enable description" msgid "Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support." -msgstr "" +msgstr "サポートの上部とモデルの間に高密度の厚板を形成します。モデルとサポート材の間にスキンが作成されます。" #: fdmprinter.def.json msgctxt "support_bottom_enable label" @@ -2769,7 +2771,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_enable description" msgid "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support." -msgstr "" +msgstr "サポートの上部とモデルの間に高密度の厚板を形成します。モデルとサポート材の間にスキンが作成されます。" #: fdmprinter.def.json msgctxt "support_interface_height label" @@ -2799,7 +2801,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_height description" msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." -msgstr "" +msgstr "サポート材の底部の厚さ。これは、サポートが置かれるモデル上の積層密度を制御します。" #: fdmprinter.def.json msgctxt "support_interface_skip_height label" @@ -2809,7 +2811,7 @@ msgstr "Support Interface Resolution" #: fdmprinter.def.json msgctxt "support_interface_skip_height description" msgid "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface." -msgstr "" +msgstr "サポートの上下にモデルがあるかどうか確認するには、特定のサポートの高さを見ます。低い値はスライスに時間がかかり、高い値にするとサポートのインターフェイスがある場所に通常のサポートを印刷する可能性があります。" #: fdmprinter.def.json msgctxt "support_interface_density label" @@ -2819,7 +2821,7 @@ msgstr "Support Interface Density" #: fdmprinter.def.json msgctxt "support_interface_density description" msgid "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "" +msgstr "サポート材の屋根と底部の密度を調整します 大きな値ではオーバーハングでの成功率があがりますが、サポート材が除去しにくくなります" #: fdmprinter.def.json msgctxt "support_roof_density label" @@ -2829,7 +2831,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_density description" msgid "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "" +msgstr "サポート材の屋根の部分の密度を調整します 大きな値ではオーバーハングの成功率があがりますが、サポート材が除去しにくくなります。" #: fdmprinter.def.json msgctxt "support_roof_line_distance label" @@ -2839,7 +2841,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_line_distance description" msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." -msgstr "" +msgstr "印刷されたサポートルーフ線間の距離。この設定は、サポート密度によって計算されますが、個別に調整することもできます。" #: fdmprinter.def.json msgctxt "support_bottom_density label" @@ -2849,7 +2851,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_density description" msgid "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model." -msgstr "" +msgstr "サポート構造の底面の密度です。高い値は、サポートのよりよい接着を促します。" #: fdmprinter.def.json msgctxt "support_bottom_line_distance label" @@ -2859,7 +2861,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_line_distance description" msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." -msgstr "" +msgstr "印刷されたサポートの底面のライン間の距離。この設定は、密度によって計算されますが、個別に調整することもできます。" #: fdmprinter.def.json msgctxt "support_interface_pattern label" @@ -2909,7 +2911,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." -msgstr "" +msgstr "サポートの天井が印刷されるパターン" #: fdmprinter.def.json msgctxt "support_roof_pattern option lines" @@ -2949,7 +2951,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_pattern description" msgid "The pattern with which the floors of the support are printed." -msgstr "" +msgstr "サポートの底面が印刷されるパターン" #: fdmprinter.def.json msgctxt "support_bottom_pattern option lines" @@ -3039,7 +3041,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_blob_enable description" msgid "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time." -msgstr "" +msgstr "印刷する前にフィラメントの小さな塊を作るかどうか。この設定をオンにすると、エクストルーダーがノズルにおいて印刷予定のマテリアルの下準備をします。印刷後ブリムまたはスカートも、上記と同じような意味を持ちます。この設定をオフにすると時間の節約にはなります。" #: fdmprinter.def.json msgctxt "extruder_prime_pos_x label" @@ -3721,7 +3723,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cutting_mesh description" msgid "Limit the volume of this mesh to within other meshes. You can use this to make certain areas of one mesh print with different settings and with a whole different extruder." -msgstr "" +msgstr "このメッシュの大きさをを他のメッシュ内に制限します。この設定を使用することで、1つの特定のメッシュ領域の設定を、、全く別のエクストルーダーで作成することができます。" #: fdmprinter.def.json msgctxt "mold_enabled label" @@ -3731,7 +3733,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_enabled description" msgid "Print models as a mold, which can be cast in order to get a model which resembles the models on the build plate." -msgstr "" +msgstr "型を取るため印刷し、ビルドプレート上の同じようなモデルを得るためにキャスト用の印刷をします。" #: fdmprinter.def.json msgctxt "mold_width label" @@ -3741,7 +3743,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_width description" msgid "The minimal distance between the ouside of the mold and the outside of the model." -msgstr "" +msgstr "型用とモデルの外側の最短距離。" #: fdmprinter.def.json msgctxt "mold_roof_height label" @@ -3751,7 +3753,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_roof_height description" msgid "The height above horizontal parts in your model which to print mold." -msgstr "" +msgstr "型を印刷するためのモデルの水平部分上の高さ。" #: fdmprinter.def.json msgctxt "mold_angle label" @@ -3761,7 +3763,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_angle description" msgid "The angle of overhang of the outer walls created for the mold. 0° will make the outer shell of the mold vertical, while 90° will make the outside of the model follow the contour of the model." -msgstr "" +msgstr "型の外側の壁のオーバーハングの角度です。0度にすると垂直の外殻をつくります。 90度は輪郭に従いモデルの外側の外殻をつくります。" #: fdmprinter.def.json msgctxt "support_mesh label" @@ -3781,7 +3783,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_mesh_drop_down description" msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh." -msgstr "" +msgstr "サポートメッシュの下のサポート材を全箇所に作ります、これはサポートメッシュ下にてオーバーハングしないようにするためです。" #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" @@ -3826,7 +3828,7 @@ msgstr "Spiralize Outer Contour" #: fdmprinter.def.json msgctxt "magic_spiralize description" msgid "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid model into a single walled print with a solid bottom. This feature should only be enabled when each layer only contains a single part." -msgstr "" +msgstr "Z軸の外側のエッジの動きを滑らかにします。全体の印刷に安定したZの動きを促し、この機能によりソリッドのモデルを固定した底辺と単一のウォールの印刷にします。この機能は各レイヤーが単一の部品を含んでいる場合のみに有効です。" #: fdmprinter.def.json msgctxt "smooth_spiralized_contours label" From 24b19fa0a56411614b9c5821736bdd9ab49695af Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 21 Jun 2017 11:29:35 +0200 Subject: [PATCH 021/379] Convert tab to spaces We indent with spaces, not tab. This one was mixed. --- resources/qml/Preferences/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 8930dbd02f..f738ff734b 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -256,7 +256,7 @@ UM.PreferencesPage - Label + Label { id: languageCaption From e7d56181484534e60df0d3b131973d63d131da22 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 21 Jun 2017 11:30:16 +0200 Subject: [PATCH 022/379] Re-enable Japanese translation Note that this only includes the setting descriptions. Contributes to issue CURA-3950. --- resources/qml/Preferences/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index f738ff734b..4abb7942bc 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -152,7 +152,7 @@ UM.PreferencesPage append({ text: "Suomi", code: "fi" }) append({ text: "Français", code: "fr" }) append({ text: "Italiano", code: "it" }) - //append({ text: "日本語", code: "jp" }) + append({ text: "日本語", code: "jp" }) //append({ text: "한국어", code: "ko" }) append({ text: "Nederlands", code: "nl" }) append({ text: "Português do Brasil", code: "ptbr" }) From 8aa420be62e60af241ef33a2b3493de57bdf3052 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 21 Jun 2017 11:53:38 +0200 Subject: [PATCH 023/379] Fix location of log on Windows It's a bit longer, but hopefully clear for both advanced system engineers and for rookies. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 08d7647893..a3e7f9c0d5 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,12 @@ For crashes and similar issues, please attach the following information: * (On Windows) The log as produced by dxdiag (start -> run -> dxdiag -> save output) * The Cura GUI log file, located at - * $User/AppData/Roaming/cura/``/cura.log (Windows) + * %APPDATA%\cura\\``\cura.log (Windows), or usually C:\Users\\``\AppData\Roaming\cura\\``\cura.log * $User/Library/Application Support/cura/``/cura.log (OSX) * $USER/.local/share/cura/``/cura.log (Ubuntu/Linux) +If the Cura user interface still starts, you can also reach this directory from the application menu in Help -> Show settings folder + Dependencies ------------ From e3629cec392d671620813c1ba5bc1da96fd0377d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 21 Jun 2017 14:24:00 +0200 Subject: [PATCH 024/379] Replaced catalog metadata entry with i18n-catalog CURA-3712 & Cura-3856 --- plugins/3MFReader/plugin.json | 2 +- plugins/3MFWriter/plugin.json | 2 +- plugins/AutoSave/plugin.json | 2 +- plugins/ChangeLogPlugin/plugin.json | 2 +- plugins/CuraEngineBackend/plugin.json | 2 +- plugins/CuraProfileReader/plugin.json | 2 +- plugins/CuraProfileWriter/plugin.json | 2 +- plugins/GCodeProfileReader/plugin.json | 2 +- plugins/GCodeReader/plugin.json | 2 +- plugins/GCodeWriter/plugin.json | 2 +- plugins/ImageReader/plugin.json | 2 +- plugins/LayerView/plugin.json | 2 +- plugins/LegacyProfileReader/plugin.json | 2 +- plugins/MachineSettingsAction/plugin.json | 2 +- plugins/PerObjectSettingsTool/plugin.json | 2 +- plugins/RemovableDriveOutputDevice/plugin.json | 2 +- plugins/SliceInfoPlugin/plugin.json | 2 +- plugins/SolidView/plugin.json | 2 +- plugins/UM3NetworkPrinting/plugin.json | 2 +- plugins/USBPrinting/plugin.json | 2 +- plugins/UltimakerMachineActions/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json | 2 +- plugins/X3DReader/plugin.json | 2 +- plugins/XRayView/plugin.json | 2 +- plugins/XmlMaterialProfile/plugin.json | 2 +- 27 files changed, 27 insertions(+), 27 deletions(-) diff --git a/plugins/3MFReader/plugin.json b/plugins/3MFReader/plugin.json index fa4578e017..c742328e15 100644 --- a/plugins/3MFReader/plugin.json +++ b/plugins/3MFReader/plugin.json @@ -4,5 +4,5 @@ "version": "1.0.0", "description": "Provides support for reading 3MF files.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/3MFWriter/plugin.json b/plugins/3MFWriter/plugin.json index fea792f904..a86177de63 100644 --- a/plugins/3MFWriter/plugin.json +++ b/plugins/3MFWriter/plugin.json @@ -4,5 +4,5 @@ "version": "1.0.0", "description": "Provides support for writing 3MF files.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/AutoSave/plugin.json b/plugins/AutoSave/plugin.json index f5bf2ba4e1..d2a31b21ef 100644 --- a/plugins/AutoSave/plugin.json +++ b/plugins/AutoSave/plugin.json @@ -4,5 +4,5 @@ "version": "1.0.0", "description": "Automatically saves Preferences, Machines and Profiles after changes.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/ChangeLogPlugin/plugin.json b/plugins/ChangeLogPlugin/plugin.json index d9d5e91679..bd67d2ba12 100644 --- a/plugins/ChangeLogPlugin/plugin.json +++ b/plugins/ChangeLogPlugin/plugin.json @@ -4,5 +4,5 @@ "version": "1.0.0", "description": "Shows changes since latest checked version.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/CuraEngineBackend/plugin.json b/plugins/CuraEngineBackend/plugin.json index 076b0ca88d..5d2060167e 100644 --- a/plugins/CuraEngineBackend/plugin.json +++ b/plugins/CuraEngineBackend/plugin.json @@ -4,5 +4,5 @@ "description": "Provides the link to the CuraEngine slicing backend.", "api": 4, "version": "1.0.0", - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/CuraProfileReader/plugin.json b/plugins/CuraProfileReader/plugin.json index 5614d38e79..9546709041 100644 --- a/plugins/CuraProfileReader/plugin.json +++ b/plugins/CuraProfileReader/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides support for importing Cura profiles.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/CuraProfileWriter/plugin.json b/plugins/CuraProfileWriter/plugin.json index e3a5782a12..c6884cb16f 100644 --- a/plugins/CuraProfileWriter/plugin.json +++ b/plugins/CuraProfileWriter/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides support for exporting Cura profiles.", "api": 4, - "catalog":"cura" + "i18n-catalog":"cura" } \ No newline at end of file diff --git a/plugins/GCodeProfileReader/plugin.json b/plugins/GCodeProfileReader/plugin.json index 1337d8dfba..a2b35513dd 100644 --- a/plugins/GCodeProfileReader/plugin.json +++ b/plugins/GCodeProfileReader/plugin.json @@ -4,5 +4,5 @@ "version": "1.0.0", "description": "Provides support for importing profiles from g-code files.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/GCodeReader/plugin.json b/plugins/GCodeReader/plugin.json index 89a70cf6b9..567024d25f 100644 --- a/plugins/GCodeReader/plugin.json +++ b/plugins/GCodeReader/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Allows loading and displaying G-code files.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/GCodeWriter/plugin.json b/plugins/GCodeWriter/plugin.json index 31fa556b0f..3161183432 100644 --- a/plugins/GCodeWriter/plugin.json +++ b/plugins/GCodeWriter/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Writes GCode to a file.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/ImageReader/plugin.json b/plugins/ImageReader/plugin.json index 87b42412b1..70dbf23240 100644 --- a/plugins/ImageReader/plugin.json +++ b/plugins/ImageReader/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Enables ability to generate printable geometry from 2D image files.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/LayerView/plugin.json b/plugins/LayerView/plugin.json index 6559ed2489..a998c8baf3 100644 --- a/plugins/LayerView/plugin.json +++ b/plugins/LayerView/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides the Layer view.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/LegacyProfileReader/plugin.json b/plugins/LegacyProfileReader/plugin.json index d1afd02ae8..9960893323 100644 --- a/plugins/LegacyProfileReader/plugin.json +++ b/plugins/LegacyProfileReader/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides support for importing profiles from legacy Cura versions.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/MachineSettingsAction/plugin.json b/plugins/MachineSettingsAction/plugin.json index 01d420fecb..3d63641c5c 100644 --- a/plugins/MachineSettingsAction/plugin.json +++ b/plugins/MachineSettingsAction/plugin.json @@ -4,5 +4,5 @@ "version": "1.0.0", "description": "Provides a way to change machine settings (such as build volume, nozzle size, etc)", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/PerObjectSettingsTool/plugin.json b/plugins/PerObjectSettingsTool/plugin.json index 6a1d33aafe..d1c0cc444c 100644 --- a/plugins/PerObjectSettingsTool/plugin.json +++ b/plugins/PerObjectSettingsTool/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides the Per Model Settings.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/RemovableDriveOutputDevice/plugin.json b/plugins/RemovableDriveOutputDevice/plugin.json index 5424ce5e34..d3e2a5f93d 100644 --- a/plugins/RemovableDriveOutputDevice/plugin.json +++ b/plugins/RemovableDriveOutputDevice/plugin.json @@ -4,5 +4,5 @@ "description": "Provides removable drive hotplugging and writing support.", "version": "1.0", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/SliceInfoPlugin/plugin.json b/plugins/SliceInfoPlugin/plugin.json index 3357214107..58416521ab 100644 --- a/plugins/SliceInfoPlugin/plugin.json +++ b/plugins/SliceInfoPlugin/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Submits anonymous slice info. Can be disabled through preferences.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/SolidView/plugin.json b/plugins/SolidView/plugin.json index e57825cb07..13017f00c2 100644 --- a/plugins/SolidView/plugin.json +++ b/plugins/SolidView/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides a normal solid mesh view.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/plugin.json b/plugins/UM3NetworkPrinting/plugin.json index e3a061d365..af33cb8556 100644 --- a/plugins/UM3NetworkPrinting/plugin.json +++ b/plugins/UM3NetworkPrinting/plugin.json @@ -4,5 +4,5 @@ "description": "Manages network connections to Ultimaker 3 printers", "version": "1.0", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/USBPrinting/plugin.json b/plugins/USBPrinting/plugin.json index 2e6e2da808..2d07848aae 100644 --- a/plugins/USBPrinting/plugin.json +++ b/plugins/USBPrinting/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "api": 4, "description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.", - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/UltimakerMachineActions/plugin.json b/plugins/UltimakerMachineActions/plugin.json index bb1af4ed8d..57709e22e5 100644 --- a/plugins/UltimakerMachineActions/plugin.json +++ b/plugins/UltimakerMachineActions/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json index dab8be0ec4..1945c3e3bb 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Upgrades configurations from Cura 2.1 to Cura 2.2.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json index f94d81049a..1487c365d3 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Upgrades configurations from Cura 2.2 to Cura 2.4.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json index 180a2bb056..d3fc10f401 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Upgrades configurations from Cura 2.5 to Cura 2.6.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/X3DReader/plugin.json b/plugins/X3DReader/plugin.json index 7ada28e19d..700df79513 100644 --- a/plugins/X3DReader/plugin.json +++ b/plugins/X3DReader/plugin.json @@ -4,5 +4,5 @@ "version": "0.5", "description": "Provides support for reading X3D files.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/XRayView/plugin.json b/plugins/XRayView/plugin.json index a8afba4635..095fcbedf3 100644 --- a/plugins/XRayView/plugin.json +++ b/plugins/XRayView/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides the X-Ray view.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file diff --git a/plugins/XmlMaterialProfile/plugin.json b/plugins/XmlMaterialProfile/plugin.json index 822dd4071f..b475d56fc3 100644 --- a/plugins/XmlMaterialProfile/plugin.json +++ b/plugins/XmlMaterialProfile/plugin.json @@ -4,5 +4,5 @@ "version": "1.0", "description": "Provides capabilities to read and write XML-based material profiles.", "api": 4, - "catalog": "cura" + "i18n-catalog": "cura" } \ No newline at end of file From 7fe5c2ad07d571e03ef31b5ba695584405e22a5a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 21 Jun 2017 14:47:57 +0200 Subject: [PATCH 025/379] Fix code style CURA-3663 --- cura/BuildVolume.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 290b8ee2de..ff5888b722 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -104,7 +104,6 @@ class BuildVolume(SceneNode): # but it does not update the disallowed areas after material change Application.getInstance().getMachineManager().activeStackChanged.connect(self._onStackChanged) - def _onSceneChanged(self, source): if self._global_container_stack: self._change_timer.start() @@ -637,7 +636,7 @@ class BuildVolume(SceneNode): result[extruder.getId()] = [] #Currently, the only normally printed object is the prime tower. - if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable") == True: + if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable"): prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") machine_width = self._global_container_stack.getProperty("machine_width", "value") machine_depth = self._global_container_stack.getProperty("machine_depth", "value") From cfe1dd4fb6dbb3f8dee11189933e6ff82e4673eb Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 19 May 2017 12:14:05 +0200 Subject: [PATCH 026/379] fix: group selection box uses proper rendermode now (CURA-3846) Renderer.RenderMode doesn't exist any more. This should have been fixed way back when RenderBatch was introduced --- plugins/SolidView/SolidView.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 60c01670b1..04a0afd77b 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -7,7 +7,7 @@ from UM.Scene.Selection import Selection from UM.Resources import Resources from UM.Application import Application from UM.Preferences import Preferences -from UM.View.Renderer import Renderer +from UM.View.RenderBatch import RenderBatch from UM.Settings.Validator import ValidatorState from UM.Math.Color import Color from UM.View.GL.OpenGL import OpenGL @@ -118,7 +118,7 @@ class SolidView(View): else: renderer.queueNode(node, material = self._enabled_shader, uniforms = uniforms) if node.callDecoration("isGroup") and Selection.isSelected(node): - renderer.queueNode(scene.getRoot(), mesh = node.getBoundingBoxMesh(), mode = Renderer.RenderLines) + renderer.queueNode(scene.getRoot(), mesh = node.getBoundingBoxMesh(), mode = RenderBatch.RenderMode.LineLoop) def endRendering(self): pass From adc547fa36b3edc288369543d1c97c648f6f22c5 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 21 Jun 2017 19:00:18 +0200 Subject: [PATCH 027/379] Don't send extruder stack settings to CuraEngine when there is just one extruder When there is 1 extruder, the frontend stores all settings in the global stack. Sending an extruder stack confuses CuraEngine into using the values of the extruder stack, which results in defaults being used. --- plugins/CuraEngineBackend/StartSliceJob.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 8abb72fa92..da60aa39e5 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -149,8 +149,9 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) self._buildGlobalInheritsStackMessage(stack) - for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): - self._buildExtruderMessage(extruder_stack) + if stack.getProperty("machine_extruder_count", "value") > 1: + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + self._buildExtruderMessage(extruder_stack) for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") From de01155630666923b79c9cda544c262f103f665b Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 21 Jun 2017 19:15:05 +0200 Subject: [PATCH 028/379] Add documentation --- plugins/CuraEngineBackend/StartSliceJob.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index da60aa39e5..b262080872 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -149,6 +149,8 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) self._buildGlobalInheritsStackMessage(stack) + # Only add extruder stacks if there are multiple extruders + # Single extruder machines only use the global stack to store setting values if stack.getProperty("machine_extruder_count", "value") > 1: for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): self._buildExtruderMessage(extruder_stack) From 73f598ff9fe776a109f513b572a8f877e3beeb62 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 22 Jun 2017 08:54:01 +0200 Subject: [PATCH 029/379] Fix code style CURA-3712 --- plugins/3MFReader/plugin.json | 2 +- plugins/3MFWriter/plugin.json | 4 ++-- plugins/AutoSave/plugin.json | 2 +- plugins/ChangeLogPlugin/plugin.json | 2 +- plugins/CuraEngineBackend/plugin.json | 2 +- plugins/CuraProfileReader/plugin.json | 2 +- plugins/CuraProfileWriter/plugin.json | 2 +- plugins/GCodeProfileReader/plugin.json | 2 +- plugins/GCodeReader/plugin.json | 2 +- plugins/GCodeWriter/plugin.json | 2 +- plugins/ImageReader/plugin.json | 2 +- plugins/LayerView/plugin.json | 2 +- plugins/LegacyProfileReader/plugin.json | 2 +- plugins/MachineSettingsAction/plugin.json | 2 +- plugins/PerObjectSettingsTool/plugin.json | 2 +- plugins/RemovableDriveOutputDevice/plugin.json | 4 ++-- plugins/SliceInfoPlugin/plugin.json | 2 +- plugins/UM3NetworkPrinting/plugin.json | 2 +- plugins/USBPrinting/plugin.json | 2 +- plugins/UltimakerMachineActions/plugin.json | 2 +- .../VersionUpgrade21to22/plugin.json | 2 +- .../VersionUpgrade22to24/plugin.json | 2 +- .../VersionUpgrade25to26/plugin.json | 2 +- plugins/X3DReader/plugin.json | 2 +- plugins/XRayView/plugin.json | 2 +- plugins/XmlMaterialProfile/plugin.json | 2 +- resources/qml/Cura.qml | 17 ++++++++--------- 27 files changed, 36 insertions(+), 37 deletions(-) diff --git a/plugins/3MFReader/plugin.json b/plugins/3MFReader/plugin.json index c742328e15..1d9dadfaab 100644 --- a/plugins/3MFReader/plugin.json +++ b/plugins/3MFReader/plugin.json @@ -5,4 +5,4 @@ "description": "Provides support for reading 3MF files.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/3MFWriter/plugin.json b/plugins/3MFWriter/plugin.json index a86177de63..cd782c270a 100644 --- a/plugins/3MFWriter/plugin.json +++ b/plugins/3MFWriter/plugin.json @@ -1,8 +1,8 @@ { - "name": "3MF Writer", + "name": "3MF Writer", "author": "Ultimaker", "version": "1.0.0", "description": "Provides support for writing 3MF files.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/AutoSave/plugin.json b/plugins/AutoSave/plugin.json index d2a31b21ef..6b1c5af4be 100644 --- a/plugins/AutoSave/plugin.json +++ b/plugins/AutoSave/plugin.json @@ -5,4 +5,4 @@ "description": "Automatically saves Preferences, Machines and Profiles after changes.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/ChangeLogPlugin/plugin.json b/plugins/ChangeLogPlugin/plugin.json index bd67d2ba12..d200394182 100644 --- a/plugins/ChangeLogPlugin/plugin.json +++ b/plugins/ChangeLogPlugin/plugin.json @@ -5,4 +5,4 @@ "description": "Shows changes since latest checked version.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/CuraEngineBackend/plugin.json b/plugins/CuraEngineBackend/plugin.json index 5d2060167e..ae9e664bdc 100644 --- a/plugins/CuraEngineBackend/plugin.json +++ b/plugins/CuraEngineBackend/plugin.json @@ -5,4 +5,4 @@ "api": 4, "version": "1.0.0", "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/CuraProfileReader/plugin.json b/plugins/CuraProfileReader/plugin.json index 9546709041..1864939353 100644 --- a/plugins/CuraProfileReader/plugin.json +++ b/plugins/CuraProfileReader/plugin.json @@ -5,4 +5,4 @@ "description": "Provides support for importing Cura profiles.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/CuraProfileWriter/plugin.json b/plugins/CuraProfileWriter/plugin.json index c6884cb16f..b0b62a3767 100644 --- a/plugins/CuraProfileWriter/plugin.json +++ b/plugins/CuraProfileWriter/plugin.json @@ -5,4 +5,4 @@ "description": "Provides support for exporting Cura profiles.", "api": 4, "i18n-catalog":"cura" -} \ No newline at end of file +} diff --git a/plugins/GCodeProfileReader/plugin.json b/plugins/GCodeProfileReader/plugin.json index a2b35513dd..dbbf4ee931 100644 --- a/plugins/GCodeProfileReader/plugin.json +++ b/plugins/GCodeProfileReader/plugin.json @@ -5,4 +5,4 @@ "description": "Provides support for importing profiles from g-code files.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/GCodeReader/plugin.json b/plugins/GCodeReader/plugin.json index 567024d25f..3bbe933c80 100644 --- a/plugins/GCodeReader/plugin.json +++ b/plugins/GCodeReader/plugin.json @@ -5,4 +5,4 @@ "description": "Allows loading and displaying G-code files.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/GCodeWriter/plugin.json b/plugins/GCodeWriter/plugin.json index 3161183432..40b63a435c 100644 --- a/plugins/GCodeWriter/plugin.json +++ b/plugins/GCodeWriter/plugin.json @@ -5,4 +5,4 @@ "description": "Writes GCode to a file.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/ImageReader/plugin.json b/plugins/ImageReader/plugin.json index 70dbf23240..c7cbc59baa 100644 --- a/plugins/ImageReader/plugin.json +++ b/plugins/ImageReader/plugin.json @@ -5,4 +5,4 @@ "description": "Enables ability to generate printable geometry from 2D image files.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/LayerView/plugin.json b/plugins/LayerView/plugin.json index a998c8baf3..8896f34fac 100644 --- a/plugins/LayerView/plugin.json +++ b/plugins/LayerView/plugin.json @@ -5,4 +5,4 @@ "description": "Provides the Layer view.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/LegacyProfileReader/plugin.json b/plugins/LegacyProfileReader/plugin.json index 9960893323..625093ce83 100644 --- a/plugins/LegacyProfileReader/plugin.json +++ b/plugins/LegacyProfileReader/plugin.json @@ -5,4 +5,4 @@ "description": "Provides support for importing profiles from legacy Cura versions.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/MachineSettingsAction/plugin.json b/plugins/MachineSettingsAction/plugin.json index 3d63641c5c..af63e3a9c8 100644 --- a/plugins/MachineSettingsAction/plugin.json +++ b/plugins/MachineSettingsAction/plugin.json @@ -5,4 +5,4 @@ "description": "Provides a way to change machine settings (such as build volume, nozzle size, etc)", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/PerObjectSettingsTool/plugin.json b/plugins/PerObjectSettingsTool/plugin.json index d1c0cc444c..772ce3aeca 100644 --- a/plugins/PerObjectSettingsTool/plugin.json +++ b/plugins/PerObjectSettingsTool/plugin.json @@ -5,4 +5,4 @@ "description": "Provides the Per Model Settings.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/RemovableDriveOutputDevice/plugin.json b/plugins/RemovableDriveOutputDevice/plugin.json index d3e2a5f93d..668e66965d 100644 --- a/plugins/RemovableDriveOutputDevice/plugin.json +++ b/plugins/RemovableDriveOutputDevice/plugin.json @@ -1,8 +1,8 @@ { "name": "Removable Drive Output Device Plugin", "author": "Ultimaker B.V.", - "description": "Provides removable drive hotplugging and writing support.", + "description": "Provides removable drive hotplugging and writing support.", "version": "1.0", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/SliceInfoPlugin/plugin.json b/plugins/SliceInfoPlugin/plugin.json index 58416521ab..9f303a67e0 100644 --- a/plugins/SliceInfoPlugin/plugin.json +++ b/plugins/SliceInfoPlugin/plugin.json @@ -5,4 +5,4 @@ "description": "Submits anonymous slice info. Can be disabled through preferences.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/UM3NetworkPrinting/plugin.json b/plugins/UM3NetworkPrinting/plugin.json index af33cb8556..7b46e7cfee 100644 --- a/plugins/UM3NetworkPrinting/plugin.json +++ b/plugins/UM3NetworkPrinting/plugin.json @@ -5,4 +5,4 @@ "version": "1.0", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/USBPrinting/plugin.json b/plugins/USBPrinting/plugin.json index 2d07848aae..6dcfdef981 100644 --- a/plugins/USBPrinting/plugin.json +++ b/plugins/USBPrinting/plugin.json @@ -5,4 +5,4 @@ "api": 4, "description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.", "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/UltimakerMachineActions/plugin.json b/plugins/UltimakerMachineActions/plugin.json index 57709e22e5..f0b01bb15e 100644 --- a/plugins/UltimakerMachineActions/plugin.json +++ b/plugins/UltimakerMachineActions/plugin.json @@ -5,4 +5,4 @@ "description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json index 1945c3e3bb..22e053bdb5 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json @@ -5,4 +5,4 @@ "description": "Upgrades configurations from Cura 2.1 to Cura 2.2.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json index 1487c365d3..3e93b4bbf8 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json @@ -5,4 +5,4 @@ "description": "Upgrades configurations from Cura 2.2 to Cura 2.4.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json index d3fc10f401..958127fe5c 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json @@ -5,4 +5,4 @@ "description": "Upgrades configurations from Cura 2.5 to Cura 2.6.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/X3DReader/plugin.json b/plugins/X3DReader/plugin.json index 700df79513..d4d437726b 100644 --- a/plugins/X3DReader/plugin.json +++ b/plugins/X3DReader/plugin.json @@ -5,4 +5,4 @@ "description": "Provides support for reading X3D files.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/XRayView/plugin.json b/plugins/XRayView/plugin.json index 095fcbedf3..ac4e632e79 100644 --- a/plugins/XRayView/plugin.json +++ b/plugins/XRayView/plugin.json @@ -5,4 +5,4 @@ "description": "Provides the X-Ray view.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/plugins/XmlMaterialProfile/plugin.json b/plugins/XmlMaterialProfile/plugin.json index b475d56fc3..a18342fcf9 100644 --- a/plugins/XmlMaterialProfile/plugin.json +++ b/plugins/XmlMaterialProfile/plugin.json @@ -5,4 +5,4 @@ "description": "Provides capabilities to read and write XML-based material profiles.", "api": 4, "i18n-catalog": "cura" -} \ No newline at end of file +} diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index bc77196b90..3addb72bed 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -261,29 +261,28 @@ UM.MainWindow if (drop.urls.length > 0) { // As the drop area also supports plugins, first check if it's a plugin that was dropped. - if(drop.urls.length == 1) + if (drop.urls.length == 1) { - if(PluginRegistry.isPluginFile(drop.urls[0])) + if (PluginRegistry.isPluginFile(drop.urls[0])) { // Try to install plugin & close. var result = PluginRegistry.installPlugin(drop.urls[0]); - pluginInstallDialog.text = result.message - if(result.status == "ok") + pluginInstallDialog.text = result.message; + if (result.status == "ok") { - pluginInstallDialog.icon = StandardIcon.Information + pluginInstallDialog.icon = StandardIcon.Information; } - else if(result.status == "duplicate") + else if (result.status == "duplicate") { - pluginInstallDialog.icon = StandardIcon.Warning + pluginInstallDialog.icon = StandardIcon.Warning; } else { - pluginInstallDialog.icon = StandardIcon.Critical + pluginInstallDialog.icon = StandardIcon.Critical; } pluginInstallDialog.open(); return; } - } openDialog.handleOpenFileUrls(drop.urls); From 4ea8cc448a2ba15c10432ea29cdfa7a5209cdb8c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 22 Jun 2017 08:57:20 +0200 Subject: [PATCH 030/379] Use semantic versioning for all plugin.json CURA-3712 --- plugins/CuraProfileReader/plugin.json | 2 +- plugins/CuraProfileWriter/plugin.json | 2 +- plugins/GCodeReader/plugin.json | 2 +- plugins/GCodeWriter/plugin.json | 2 +- plugins/ImageReader/plugin.json | 2 +- plugins/LayerView/plugin.json | 2 +- plugins/LegacyProfileReader/plugin.json | 2 +- plugins/PerObjectSettingsTool/plugin.json | 2 +- plugins/RemovableDriveOutputDevice/plugin.json | 2 +- plugins/SliceInfoPlugin/plugin.json | 2 +- plugins/SolidView/plugin.json | 2 +- plugins/UM3NetworkPrinting/plugin.json | 2 +- plugins/USBPrinting/plugin.json | 2 +- plugins/UltimakerMachineActions/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json | 2 +- plugins/X3DReader/plugin.json | 2 +- plugins/XRayView/plugin.json | 2 +- plugins/XmlMaterialProfile/plugin.json | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/plugins/CuraProfileReader/plugin.json b/plugins/CuraProfileReader/plugin.json index 1864939353..3dd003715b 100644 --- a/plugins/CuraProfileReader/plugin.json +++ b/plugins/CuraProfileReader/plugin.json @@ -1,7 +1,7 @@ { "name": "Cura Profile Reader", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides support for importing Cura profiles.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/CuraProfileWriter/plugin.json b/plugins/CuraProfileWriter/plugin.json index b0b62a3767..23d4322556 100644 --- a/plugins/CuraProfileWriter/plugin.json +++ b/plugins/CuraProfileWriter/plugin.json @@ -1,7 +1,7 @@ { "name": "Cura Profile Writer", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides support for exporting Cura profiles.", "api": 4, "i18n-catalog":"cura" diff --git a/plugins/GCodeReader/plugin.json b/plugins/GCodeReader/plugin.json index 3bbe933c80..f72a8cc12c 100644 --- a/plugins/GCodeReader/plugin.json +++ b/plugins/GCodeReader/plugin.json @@ -1,7 +1,7 @@ { "name": "G-code Reader", "author": "Victor Larchenko", - "version": "1.0", + "version": "1.0.0", "description": "Allows loading and displaying G-code files.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/GCodeWriter/plugin.json b/plugins/GCodeWriter/plugin.json index 40b63a435c..d98d9426f2 100644 --- a/plugins/GCodeWriter/plugin.json +++ b/plugins/GCodeWriter/plugin.json @@ -1,7 +1,7 @@ { "name": "GCode Writer", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Writes GCode to a file.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/ImageReader/plugin.json b/plugins/ImageReader/plugin.json index c7cbc59baa..f8dcb8e91c 100644 --- a/plugins/ImageReader/plugin.json +++ b/plugins/ImageReader/plugin.json @@ -1,7 +1,7 @@ { "name": "Image Reader", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Enables ability to generate printable geometry from 2D image files.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/LayerView/plugin.json b/plugins/LayerView/plugin.json index 8896f34fac..979359a002 100644 --- a/plugins/LayerView/plugin.json +++ b/plugins/LayerView/plugin.json @@ -1,7 +1,7 @@ { "name": "Layer View", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides the Layer view.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/LegacyProfileReader/plugin.json b/plugins/LegacyProfileReader/plugin.json index 625093ce83..6f08bb2ab0 100644 --- a/plugins/LegacyProfileReader/plugin.json +++ b/plugins/LegacyProfileReader/plugin.json @@ -1,7 +1,7 @@ { "name": "Legacy Cura Profile Reader", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides support for importing profiles from legacy Cura versions.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/PerObjectSettingsTool/plugin.json b/plugins/PerObjectSettingsTool/plugin.json index 772ce3aeca..1eba8aff65 100644 --- a/plugins/PerObjectSettingsTool/plugin.json +++ b/plugins/PerObjectSettingsTool/plugin.json @@ -1,7 +1,7 @@ { "name": "Per Model Settings Tool", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides the Per Model Settings.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/RemovableDriveOutputDevice/plugin.json b/plugins/RemovableDriveOutputDevice/plugin.json index 668e66965d..df11644256 100644 --- a/plugins/RemovableDriveOutputDevice/plugin.json +++ b/plugins/RemovableDriveOutputDevice/plugin.json @@ -2,7 +2,7 @@ "name": "Removable Drive Output Device Plugin", "author": "Ultimaker B.V.", "description": "Provides removable drive hotplugging and writing support.", - "version": "1.0", + "version": "1.0.0", "api": 4, "i18n-catalog": "cura" } diff --git a/plugins/SliceInfoPlugin/plugin.json b/plugins/SliceInfoPlugin/plugin.json index 9f303a67e0..7c9538b679 100644 --- a/plugins/SliceInfoPlugin/plugin.json +++ b/plugins/SliceInfoPlugin/plugin.json @@ -1,7 +1,7 @@ { "name": "Slice info", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Submits anonymous slice info. Can be disabled through preferences.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/SolidView/plugin.json b/plugins/SolidView/plugin.json index 13017f00c2..22cd202489 100644 --- a/plugins/SolidView/plugin.json +++ b/plugins/SolidView/plugin.json @@ -1,7 +1,7 @@ { "name": "Solid View", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides a normal solid mesh view.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/UM3NetworkPrinting/plugin.json b/plugins/UM3NetworkPrinting/plugin.json index 7b46e7cfee..30b6c153e6 100644 --- a/plugins/UM3NetworkPrinting/plugin.json +++ b/plugins/UM3NetworkPrinting/plugin.json @@ -2,7 +2,7 @@ "name": "UM3 Network Connection", "author": "Ultimaker", "description": "Manages network connections to Ultimaker 3 printers", - "version": "1.0", + "version": "1.0.0", "api": 4, "i18n-catalog": "cura" } diff --git a/plugins/USBPrinting/plugin.json b/plugins/USBPrinting/plugin.json index 6dcfdef981..600551a6dc 100644 --- a/plugins/USBPrinting/plugin.json +++ b/plugins/USBPrinting/plugin.json @@ -1,7 +1,7 @@ { "name": "USB printing", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "api": 4, "description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.", "i18n-catalog": "cura" diff --git a/plugins/UltimakerMachineActions/plugin.json b/plugins/UltimakerMachineActions/plugin.json index f0b01bb15e..2c95d8e6fd 100644 --- a/plugins/UltimakerMachineActions/plugin.json +++ b/plugins/UltimakerMachineActions/plugin.json @@ -1,7 +1,7 @@ { "name": "Ultimaker machine actions", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json index 22e053bdb5..03c0e72f5c 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json @@ -1,7 +1,7 @@ { "name": "Version Upgrade 2.1 to 2.2", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Upgrades configurations from Cura 2.1 to Cura 2.2.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json index 3e93b4bbf8..204851f4e8 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json @@ -1,7 +1,7 @@ { "name": "Version Upgrade 2.2 to 2.4", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Upgrades configurations from Cura 2.2 to Cura 2.4.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json index 958127fe5c..3e5eb75eee 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json @@ -1,7 +1,7 @@ { "name": "Version Upgrade 2.5 to 2.6", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Upgrades configurations from Cura 2.5 to Cura 2.6.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/X3DReader/plugin.json b/plugins/X3DReader/plugin.json index d4d437726b..f18c7f033d 100644 --- a/plugins/X3DReader/plugin.json +++ b/plugins/X3DReader/plugin.json @@ -1,7 +1,7 @@ { "name": "X3D Reader", "author": "Seva Alekseyev", - "version": "0.5", + "version": "0.5.0", "description": "Provides support for reading X3D files.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/XRayView/plugin.json b/plugins/XRayView/plugin.json index ac4e632e79..67f0d808f1 100644 --- a/plugins/XRayView/plugin.json +++ b/plugins/XRayView/plugin.json @@ -1,7 +1,7 @@ { "name": "X-Ray View", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides the X-Ray view.", "api": 4, "i18n-catalog": "cura" diff --git a/plugins/XmlMaterialProfile/plugin.json b/plugins/XmlMaterialProfile/plugin.json index a18342fcf9..47897b7ad4 100644 --- a/plugins/XmlMaterialProfile/plugin.json +++ b/plugins/XmlMaterialProfile/plugin.json @@ -1,7 +1,7 @@ { "name": "Material Profiles", "author": "Ultimaker", - "version": "1.0", + "version": "1.0.0", "description": "Provides capabilities to read and write XML-based material profiles.", "api": 4, "i18n-catalog": "cura" From 5900bb86225fd0cb02243169a99ad35a0ce70add Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 22 Jun 2017 08:58:52 +0200 Subject: [PATCH 031/379] Use "Ultimaker" as the author for ultimaker plugins CURA-3712 --- plugins/RemovableDriveOutputDevice/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/RemovableDriveOutputDevice/plugin.json b/plugins/RemovableDriveOutputDevice/plugin.json index df11644256..bdae36d6cb 100644 --- a/plugins/RemovableDriveOutputDevice/plugin.json +++ b/plugins/RemovableDriveOutputDevice/plugin.json @@ -1,6 +1,6 @@ { "name": "Removable Drive Output Device Plugin", - "author": "Ultimaker B.V.", + "author": "Ultimaker", "description": "Provides removable drive hotplugging and writing support.", "version": "1.0.0", "api": 4, From 11dad711e61733d3b62861bfb0f882749f44aa7c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 23 May 2017 14:02:04 +0200 Subject: [PATCH 032/379] Added two new required settings for prime tower purge CURA-3094 --- resources/definitions/fdmprinter.def.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 46505b8152..f6f71e218b 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4414,6 +4414,27 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "prime_tower_purge_enabled": + { + "label": "Purge Extruder on Prime Tower Wipe.", + "description": "Should an extra amount be extruded before wiping the nozzle on the prime tower.", + "enabled": "prime_tower_wipe_enabled", + "unit": "mm³", + "type": "float", + "default_value": 1, + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "prime_tower_purge_volume": + { + "label": "Wipe Tower Purge Volume", + "description": "Amount of filament to be purged when wiping on prime tower.", + "type": "bool", + "enabled": "prime_tower_purge_enabled", + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": true + }, "dual_pre_wipe": { "label": "Wipe Nozzle After Switch", From 151d7d285bfb86fcf1d0a5909aeef66a3c0e5eac Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 24 May 2017 11:03:24 +0200 Subject: [PATCH 033/379] Added default values & some warnings CURA-3094 --- resources/definitions/fdmprinter.def.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f6f71e218b..0105fdd26c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4419,9 +4419,8 @@ "label": "Purge Extruder on Prime Tower Wipe.", "description": "Should an extra amount be extruded before wiping the nozzle on the prime tower.", "enabled": "prime_tower_wipe_enabled", - "unit": "mm³", - "type": "float", - "default_value": 1, + "type": "bool", + "default_value": false, "settable_per_mesh": false, "settable_per_extruder": true }, @@ -4429,9 +4428,12 @@ { "label": "Wipe Tower Purge Volume", "description": "Amount of filament to be purged when wiping on prime tower.", - "type": "bool", + "type": "float", "enabled": "prime_tower_purge_enabled", - "default_value": true, + "unit": "mm³", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "20", "settable_per_mesh": false, "settable_per_extruder": true }, From 1ec9987cc217b5fb65af51d6bdb8dfc02971a57b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 31 May 2017 09:43:53 +0200 Subject: [PATCH 034/379] Removed prime tower wipe enabled setting CURA-3094 --- resources/definitions/fdmprinter.def.json | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0105fdd26c..1b3b8b956a 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4414,26 +4414,16 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "prime_tower_purge_enabled": - { - "label": "Purge Extruder on Prime Tower Wipe.", - "description": "Should an extra amount be extruded before wiping the nozzle on the prime tower.", - "enabled": "prime_tower_wipe_enabled", - "type": "bool", - "default_value": false, - "settable_per_mesh": false, - "settable_per_extruder": true - }, "prime_tower_purge_volume": { "label": "Wipe Tower Purge Volume", - "description": "Amount of filament to be purged when wiping on prime tower.", + "description": "Amount of filament to be purged when wiping on prime tower. This is usefull for compensating the filament lost by oozing during the inactivity of the nozzle.", "type": "float", - "enabled": "prime_tower_purge_enabled", + "enabled": "prime_tower_enable", "unit": "mm³", - "default_value": 1, + "default_value": 0, "minimum_value": "0", - "maximum_value_warning": "20", + "maximum_value_warning": "5", "settable_per_mesh": false, "settable_per_extruder": true }, From b05f1654f8aded1a462bd16ff7b011d7085e28ad Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 31 May 2017 14:19:25 +0200 Subject: [PATCH 035/379] Fix spelling of Prime Tower Purge Volume description 'Useful' is spelled with only one L. Contributes to issue 3094. --- 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 1b3b8b956a..05345a0f3e 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4417,7 +4417,7 @@ "prime_tower_purge_volume": { "label": "Wipe Tower Purge Volume", - "description": "Amount of filament to be purged when wiping on prime tower. This is usefull for compensating the filament lost by oozing during the inactivity of the nozzle.", + "description": "Amount of filament to be purged when wiping on prime tower. This is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", "type": "float", "enabled": "prime_tower_enable", "unit": "mm³", From 8393a0efb48b18ffb7ac8068ede787e59d57d9ab Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 19 Jun 2017 10:52:54 +0200 Subject: [PATCH 036/379] Use resolveOrValue(prime_tower_enable) for prime tower purge "enabled" field CURA-3094 --- 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 05345a0f3e..b150550bb0 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4419,7 +4419,7 @@ "label": "Wipe Tower Purge Volume", "description": "Amount of filament to be purged when wiping on prime tower. This is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", "type": "float", - "enabled": "prime_tower_enable", + "enabled": "resolveOrValue('prime_tower_enable')", "unit": "mm³", "default_value": 0, "minimum_value": "0", From 81323e555aa8da6f2eca630708f9f364edea1e97 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 20 Jun 2017 16:54:40 +0200 Subject: [PATCH 037/379] Make LayerView work with "Purge" line type CURA-3094 In CuraEngine, we created a new line type called "Purge" to make Prime Tower Purge work. This commit makes the LayerView plugin to handle "Purge" lines correctly. --- cura/LayerPolygon.py | 13 +++++++++---- plugins/LayerView/LayerPass.py | 2 ++ plugins/LayerView/LayerView.py | 11 +++++++++++ plugins/LayerView/LayerView.qml | 8 ++++++++ plugins/LayerView/layers.shader | 13 +++++++++++++ plugins/LayerView/layers3d.shader | 5 +++++ resources/themes/cura/theme.json | 5 +++-- 7 files changed, 51 insertions(+), 6 deletions(-) diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index d6ab854169..59c900a263 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -18,10 +18,14 @@ class LayerPolygon: MoveCombingType = 8 MoveRetractionType = 9 SupportInterfaceType = 10 - __number_of_types = 11 + PurgeType = 11 + + __number_of_types = 12 + + __jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType, + numpy.arange(__number_of_types) == MoveCombingType), + numpy.arange(__number_of_types) == MoveRetractionType) - __jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType, numpy.arange(__number_of_types) == MoveCombingType), numpy.arange(__number_of_types) == MoveRetractionType) - ## LayerPolygon, used in ProcessSlicedLayersJob # \param extruder # \param line_types array with line_types @@ -222,7 +226,8 @@ class LayerPolygon: theme.getColor("layerview_support_infill").getRgbF(), # SupportInfillType theme.getColor("layerview_move_combing").getRgbF(), # MoveCombingType theme.getColor("layerview_move_retraction").getRgbF(), # MoveRetractionType - theme.getColor("layerview_support_interface").getRgbF() # SupportInterfaceType + theme.getColor("layerview_support_interface").getRgbF(), # SupportInterfaceType + theme.getColor("layerview_purge").getRgbF() # PurgeType ]) return cls.__color_map diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 51a35fb48a..269e28d473 100755 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -51,6 +51,7 @@ class LayerPass(RenderPass): self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) + self._layer_shader.setUniformValue("u_show_purge", self._layer_view.getShowPurge()) else: #defaults self._layer_shader.setUniformValue("u_layer_view_type", 1) @@ -59,6 +60,7 @@ class LayerPass(RenderPass): self._layer_shader.setUniformValue("u_show_helpers", 1) self._layer_shader.setUniformValue("u_show_skin", 1) self._layer_shader.setUniformValue("u_show_infill", 1) + self._layer_shader.setUniformValue("u_show_purge", 1) if not self._tool_handle_shader: self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 97a343bd33..4230c0f9e0 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -82,6 +82,7 @@ class LayerView(View): Preferences.getInstance().addPreference("layerview/show_helpers", True) Preferences.getInstance().addPreference("layerview/show_skin", True) Preferences.getInstance().addPreference("layerview/show_infill", True) + Preferences.getInstance().addPreference("layerview/show_purge", True) Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) self._updateWithPreferences() @@ -100,6 +101,7 @@ class LayerView(View): self._show_helpers = 1 self._show_skin = 1 self._show_infill = 1 + self._show_purge = 1 def getActivity(self): return self._activity @@ -237,6 +239,13 @@ class LayerView(View): def getShowInfill(self): return self._show_infill + def setShowPurge(self, show): + self._show_purge = show + self.currentLayerNumChanged.emit() + + def getShowPurge(self): + return self._show_purge + def getCompatibilityMode(self): return self._compatibility_mode @@ -408,6 +417,7 @@ class LayerView(View): self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) + self.setShowPurge(bool(Preferences.getInstance().getValue("layerview/show_purge"))) self._startUpdateTopLayers() self.preferencesChanged.emit() @@ -423,6 +433,7 @@ class LayerView(View): "layerview/show_helpers", "layerview/show_skin", "layerview/show_infill", + "layerview/show_purge", }: return diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 9dc038fe70..1757d72ac7 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -43,6 +43,7 @@ Item property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") + property bool show_purge: UM.Preferences.getValue("layerview/show_purge") // if we are in compatibility mode, we only show the "line type" property bool show_legend: UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type") == 1 property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") @@ -157,6 +158,7 @@ Item view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + view_settings.show_purge = UM.Preferences.getValue("layerview/show_purge"); view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); } @@ -219,6 +221,12 @@ Item preference: "layerview/show_infill", colorId: "layerview_infill" }); + typesLegenModel.append({ + label: catalog.i18nc("@label", "Show Purge"), + initialValue: view_settings.show_purge, + preference: "layerview/show_purge", + colorId: "layerview_purge" + }); } } diff --git a/plugins/LayerView/layers.shader b/plugins/LayerView/layers.shader index d340773403..2f7a01cf11 100755 --- a/plugins/LayerView/layers.shader +++ b/plugins/LayerView/layers.shader @@ -35,6 +35,7 @@ fragment = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; + uniform int u_show_purge; void main() { @@ -62,6 +63,11 @@ fragment = // discard movements discard; } + // purge: + if ((u_show_purge == 0) && (v_line_type >= 10.5) && (v_line_type <= 11.5)) { + // discard movements + discard; + } gl_FragColor = v_color; } @@ -103,6 +109,7 @@ fragment41core = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; + uniform int u_show_purge; void main() { @@ -130,6 +137,11 @@ fragment41core = // discard movements discard; } + // purge: + if ((u_show_purge == 0) && (v_line_type >= 10.5) && (v_line_type <= 11.5)) { + // discard movements + discard; + } frag_color = v_color; } @@ -144,6 +156,7 @@ u_show_travel_moves = 0 u_show_helpers = 1 u_show_skin = 1 u_show_infill = 1 +u_show_purge = 1 [bindings] u_modelViewProjectionMatrix = model_view_projection_matrix diff --git a/plugins/LayerView/layers3d.shader b/plugins/LayerView/layers3d.shader index 6f5e986eec..ef6286c831 100755 --- a/plugins/LayerView/layers3d.shader +++ b/plugins/LayerView/layers3d.shader @@ -71,6 +71,7 @@ geometry41core = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; + uniform int u_show_purge; layout(lines) in; layout(triangle_strip, max_vertices = 26) out; @@ -125,6 +126,9 @@ geometry41core = if ((u_show_infill == 0) && (v_line_type[0] == 6)) { return; } + if ((u_show_purge == 0) && (v_line_type[0] == 11)) { + return; + } if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { // fixed size for movements @@ -246,6 +250,7 @@ u_show_travel_moves = 0 u_show_helpers = 1 u_show_skin = 1 u_show_infill = 1 +u_show_purge = 1 [bindings] u_modelViewProjectionMatrix = model_view_projection_matrix diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index a36f271fe8..e2de9e230d 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -246,7 +246,8 @@ "layerview_support_infill": [0, 255, 255, 255], "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 128, 255, 255], - "layerview_support_interface": [64, 192, 255, 255] + "layerview_support_interface": [64, 192, 255, 255], + "layerview_purge": [101, 51, 175, 255] }, "sizes": { @@ -306,7 +307,7 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [1.0, 1.0], - "layerview_menu_size": [16.5, 21.0], + "layerview_menu_size": [16.5, 23.0], "layerview_menu_size_compatibility": [22, 23.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], From 6be76ec80669e86e74aaca5da4f579173dc9f572 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 21 Jun 2017 11:47:48 +0200 Subject: [PATCH 038/379] Fix code style CURA-3872 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index b262080872..4588982bf2 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -215,7 +215,7 @@ class StartSliceJob(Job): for key in stack.getAllKeys(): # Do not send settings that are not settable_per_extruder. - if stack.getProperty(key, "settable_per_extruder") == False: + if not stack.getProperty(key, "settable_per_extruder"): continue setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key From 46b6e5b0a11f41eed63c5fe8922c6fbb78169de0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 21 Jun 2017 11:48:51 +0200 Subject: [PATCH 039/379] Add machine_nozzle_type and set them in UM3 and UM3XL variants CURA-3872 We add a new setting "machine_nozzle_type" to give the engine information about the nozzle type, such as "AA" and "BB". This is applicable to UM3 and UM3XL. --- resources/definitions/fdmextruder.def.json | 9 +++++++++ resources/definitions/fdmprinter.def.json | 9 +++++++++ resources/variants/ultimaker3_aa0.8.inst.cfg | 1 + resources/variants/ultimaker3_aa04.inst.cfg | 1 + resources/variants/ultimaker3_bb0.8.inst.cfg | 1 + resources/variants/ultimaker3_bb04.inst.cfg | 1 + resources/variants/ultimaker3_extended_aa0.8.inst.cfg | 1 + resources/variants/ultimaker3_extended_aa04.inst.cfg | 1 + resources/variants/ultimaker3_extended_bb0.8.inst.cfg | 1 + resources/variants/ultimaker3_extended_bb04.inst.cfg | 1 + 10 files changed, 26 insertions(+) diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index be006dfe59..4ee1ff515a 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -30,6 +30,15 @@ "settable_per_meshgroup": false, "settable_globally": false }, + "machine_nozzle_type": + { + "label": "Nozzle Type", + "description": "The nozzle type for an extruder train, such as \"AA\" and \"BB\".", + "type": "str", + "default_value": "unknown", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "machine_nozzle_size": { "label": "Nozzle Diameter", diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 46505b8152..fd526e6378 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -407,6 +407,15 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, + "machine_nozzle_type": + { + "label": "Nozzle Type", + "description": "The nozzle type for an extruder train, such as \"AA\" and \"BB\".", + "type": "str", + "default_value": "unknown", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "machine_nozzle_size": { "label": "Nozzle Diameter", diff --git a/resources/variants/ultimaker3_aa0.8.inst.cfg b/resources/variants/ultimaker3_aa0.8.inst.cfg index e94177abc3..7ce43a0a1a 100644 --- a/resources/variants/ultimaker3_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_aa0.8.inst.cfg @@ -31,6 +31,7 @@ line_width = =machine_nozzle_size machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_type = AA machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_final_print_temperature = =material_print_temperature - 10 diff --git a/resources/variants/ultimaker3_aa04.inst.cfg b/resources/variants/ultimaker3_aa04.inst.cfg index 4cf31caef0..16f7bf2317 100644 --- a/resources/variants/ultimaker3_aa04.inst.cfg +++ b/resources/variants/ultimaker3_aa04.inst.cfg @@ -11,6 +11,7 @@ setting_version = 1 [values] brim_width = 7 machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_type = AA raft_acceleration = =acceleration_print raft_airgap = 0.3 raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index aa2042b271..ac451866c2 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -29,6 +29,7 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) layer_height = 0.2 machine_min_cool_heat_time_window = 15 machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_type = BB machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index f379a8d1e2..cb30142de7 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -17,6 +17,7 @@ jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_type = BB material_print_temperature = 215 raft_base_speed = 20 raft_interface_speed = 20 diff --git a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg index 47b0359df7..e2f5d50c0c 100644 --- a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg @@ -31,6 +31,7 @@ line_width = =machine_nozzle_size machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_type = AA machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_final_print_temperature = =material_print_temperature - 10 diff --git a/resources/variants/ultimaker3_extended_aa04.inst.cfg b/resources/variants/ultimaker3_extended_aa04.inst.cfg index 99daa082e4..5e97ec11e0 100644 --- a/resources/variants/ultimaker3_extended_aa04.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa04.inst.cfg @@ -11,6 +11,7 @@ setting_version = 1 [values] brim_width = 7 machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_type = AA machine_nozzle_size = 0.4 raft_airgap = 0.3 raft_base_speed = 15 diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg index c982d207b0..90d0a34d09 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -29,6 +29,7 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) layer_height = 0.2 machine_min_cool_heat_time_window = 15 machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_type = BB machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index abeaf69db2..5c4ae3284c 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -17,6 +17,7 @@ jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_type = BB material_print_temperature = 215 raft_base_speed = 20 raft_interface_speed = 20 From 293c1690c66f6cb854ebef3835b66cf71a874470 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 22 Jun 2017 13:58:42 +0200 Subject: [PATCH 040/379] Change to use machine_nozzle_id CURA-3872 We cannot assume that all nozzles will have IDs like " " such as "AA 0.4", so we should use a complete string as the nozzle IDs. --- resources/definitions/fdmextruder.def.json | 6 +++--- resources/definitions/fdmprinter.def.json | 6 +++--- resources/variants/ultimaker3_aa0.8.inst.cfg | 2 +- resources/variants/ultimaker3_aa04.inst.cfg | 2 +- resources/variants/ultimaker3_bb0.8.inst.cfg | 2 +- resources/variants/ultimaker3_bb04.inst.cfg | 2 +- resources/variants/ultimaker3_extended_aa0.8.inst.cfg | 2 +- resources/variants/ultimaker3_extended_aa04.inst.cfg | 2 +- resources/variants/ultimaker3_extended_bb0.8.inst.cfg | 2 +- resources/variants/ultimaker3_extended_bb04.inst.cfg | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 4ee1ff515a..bf235d76eb 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -30,10 +30,10 @@ "settable_per_meshgroup": false, "settable_globally": false }, - "machine_nozzle_type": + "machine_nozzle_id": { - "label": "Nozzle Type", - "description": "The nozzle type for an extruder train, such as \"AA\" and \"BB\".", + "label": "Nozzle ID", + "description": "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\".", "type": "str", "default_value": "unknown", "settable_per_mesh": false, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index fd526e6378..40f224a98a 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -407,10 +407,10 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, - "machine_nozzle_type": + "machine_nozzle_id": { - "label": "Nozzle Type", - "description": "The nozzle type for an extruder train, such as \"AA\" and \"BB\".", + "label": "Nozzle ID", + "description": "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\".", "type": "str", "default_value": "unknown", "settable_per_mesh": false, diff --git a/resources/variants/ultimaker3_aa0.8.inst.cfg b/resources/variants/ultimaker3_aa0.8.inst.cfg index 7ce43a0a1a..41d6191883 100644 --- a/resources/variants/ultimaker3_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_aa0.8.inst.cfg @@ -31,7 +31,7 @@ line_width = =machine_nozzle_size machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 -machine_nozzle_type = AA +machine_nozzle_id = AA 0.8 machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_final_print_temperature = =material_print_temperature - 10 diff --git a/resources/variants/ultimaker3_aa04.inst.cfg b/resources/variants/ultimaker3_aa04.inst.cfg index 16f7bf2317..ff380197ea 100644 --- a/resources/variants/ultimaker3_aa04.inst.cfg +++ b/resources/variants/ultimaker3_aa04.inst.cfg @@ -11,7 +11,7 @@ setting_version = 1 [values] brim_width = 7 machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_type = AA +machine_nozzle_id = AA 0.4 raft_acceleration = =acceleration_print raft_airgap = 0.3 raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index ac451866c2..c9a8c5a945 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -29,7 +29,7 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) layer_height = 0.2 machine_min_cool_heat_time_window = 15 machine_nozzle_heat_up_speed = 1.5 -machine_nozzle_type = BB +machine_nozzle_id = BB 0.8 machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index cb30142de7..5a4b39f68a 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -17,7 +17,7 @@ jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 -machine_nozzle_type = BB +machine_nozzle_id = BB 0.4 material_print_temperature = 215 raft_base_speed = 20 raft_interface_speed = 20 diff --git a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg index e2f5d50c0c..c2ecbcdf49 100644 --- a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg @@ -31,7 +31,7 @@ line_width = =machine_nozzle_size machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 -machine_nozzle_type = AA +machine_nozzle_id = AA 0.8 machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_final_print_temperature = =material_print_temperature - 10 diff --git a/resources/variants/ultimaker3_extended_aa04.inst.cfg b/resources/variants/ultimaker3_extended_aa04.inst.cfg index 5e97ec11e0..f66be12d49 100644 --- a/resources/variants/ultimaker3_extended_aa04.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa04.inst.cfg @@ -11,7 +11,7 @@ setting_version = 1 [values] brim_width = 7 machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_type = AA +machine_nozzle_id = AA 0.4 machine_nozzle_size = 0.4 raft_airgap = 0.3 raft_base_speed = 15 diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg index 90d0a34d09..8a4dcfee09 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -29,7 +29,7 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) layer_height = 0.2 machine_min_cool_heat_time_window = 15 machine_nozzle_heat_up_speed = 1.5 -machine_nozzle_type = BB +machine_nozzle_id = BB 0.8 machine_nozzle_size = 0.8 machine_nozzle_tip_outer_diameter = 2.0 material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index 5c4ae3284c..e35ab82d9f 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -17,7 +17,7 @@ jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 -machine_nozzle_type = BB +machine_nozzle_id = BB 0.4 material_print_temperature = 215 raft_base_speed = 20 raft_interface_speed = 20 From 29e152582fbc9f039eb586543147cd71ad732f4e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 22 Jun 2017 14:30:26 +0200 Subject: [PATCH 041/379] Make layerview panel hug the bottom of small windows Fixes https://github.com/Ultimaker/Cura/issues/2013 --- resources/qml/Cura.qml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 3addb72bed..d4a6a90b6b 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -306,9 +306,12 @@ UM.MainWindow { id: view_panel - anchors.top: viewModeButton.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height; + property bool hugBottom: parent.height < viewModeButton.y + viewModeButton.height + height + UM.Theme.getSize("default_margin").height + + anchors.bottom: parent.bottom + anchors.bottomMargin: hugBottom ? 0 : parent.height - (viewModeButton.y + viewModeButton.height + height + UM.Theme.getSize("default_margin").height) anchors.left: viewModeButton.left; + anchors.leftMargin: hugBottom ? viewModeButton.width + UM.Theme.getSize("default_margin").width : 0 height: childrenRect.height; From b9e863a953a77fb812b1e343c8a7f11128784f2e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 22 Jun 2017 14:39:46 +0200 Subject: [PATCH 042/379] Added PluginBrowser stub CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 18 ++++++++++++++++++ plugins/PluginBrowser/__init__.py | 12 ++++++++++++ plugins/PluginBrowser/plugin.json | 7 +++++++ 3 files changed, 37 insertions(+) create mode 100644 plugins/PluginBrowser/PluginBrowser.py create mode 100644 plugins/PluginBrowser/__init__.py create mode 100644 plugins/PluginBrowser/plugin.json diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py new file mode 100644 index 0000000000..56833ed44e --- /dev/null +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -0,0 +1,18 @@ +# Copyright (c) 2017 Ultimaker B.V. +# PluginBrowser is released under the terms of the AGPLv3 or higher. + + +from UM.Extension import Extension +from UM.i18n import i18nCatalog + + +i18n_catalog = i18nCatalog("cura") + + +class PluginBrowser(Extension): + def __init__(self): + super().__init__() + self.addMenuItem(i18n_catalog.i18n("Browse plugins"), self.browsePlugins) + + def browsePlugins(self): + pass \ No newline at end of file diff --git a/plugins/PluginBrowser/__init__.py b/plugins/PluginBrowser/__init__.py new file mode 100644 index 0000000000..19013bd06d --- /dev/null +++ b/plugins/PluginBrowser/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2017 Ultimaker B.V. +# PluginBrowser is released under the terms of the AGPLv3 or higher. + +from . import PluginBrowser + + +def getMetaData(): + return {} + + +def register(app): + return {"extension": PluginBrowser.PluginBrowser()} diff --git a/plugins/PluginBrowser/plugin.json b/plugins/PluginBrowser/plugin.json new file mode 100644 index 0000000000..1447445e95 --- /dev/null +++ b/plugins/PluginBrowser/plugin.json @@ -0,0 +1,7 @@ +{ + "name": "Plugin Browser", + "author": "Ultimaker", + "version": "1.0.0", + "api": 4, + "description": "Find, manage and install new plugins." +} \ No newline at end of file From fad78c20b53c17033e75493f848d4c57e0e3abfb Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 22 Jun 2017 14:38:59 +0200 Subject: [PATCH 043/379] fix: copy global settings into extruder msessage for SE (CURA-3930) --- plugins/CuraEngineBackend/StartSliceJob.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index b262080872..bb834324a8 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -154,6 +154,8 @@ class StartSliceJob(Job): if stack.getProperty("machine_extruder_count", "value") > 1: for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): self._buildExtruderMessage(extruder_stack) + else: + self._buildExtruderMessageFromGlobalStack(stack) for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") @@ -226,6 +228,19 @@ class StartSliceJob(Job): setting.value = str(stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread() + ## Create extruder message from global stack + def _buildExtruderMessageFromGlobalStack(self, stack): + message = self._slice_message.addRepeatedMessage("extruders") + + for key in stack.getAllKeys(): + # Do not send settings that are not settable_per_extruder. + if stack.getProperty(key, "settable_per_extruder") == False: + continue + setting = message.getMessage("settings").addRepeatedMessage("settings") + setting.name = key + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() + ## Sends all global settings to the engine. # # The settings are taken from the global stack. This does not include any From 48efcdf6e4733b1cae6195c1a3475ab553b0b2b2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 22 Jun 2017 14:59:15 +0200 Subject: [PATCH 044/379] Use a PointingRectangle for the LayerView pane --- plugins/LayerView/LayerView.qml | 10 +++++++++- resources/qml/Cura.qml | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 9dc038fe70..46268a784d 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -11,6 +11,7 @@ import Cura 1.0 as Cura Item { + id: base width: { if (UM.LayerView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").width; @@ -25,8 +26,12 @@ Item return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } } + property var buttonTarget: { + var force_binding = parent.y; // ensure this gets reevaluated when the panel moves + return base.mapFromItem(parent.parent, parent.buttonTarget.x, parent.buttonTarget.y); + } - Rectangle { + UM.PointingRectangle { id: layerViewMenu anchors.left: parent.left anchors.top: parent.top @@ -35,6 +40,9 @@ Item z: slider.z - 1 color: UM.Theme.getColor("tool_panel_background") + target: parent.buttonTarget + arrowSize: UM.Theme.getSize("default_arrow").width + ColumnLayout { id: view_settings diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index d4a6a90b6b..612ef6b41b 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -308,11 +308,13 @@ UM.MainWindow property bool hugBottom: parent.height < viewModeButton.y + viewModeButton.height + height + UM.Theme.getSize("default_margin").height - anchors.bottom: parent.bottom + anchors.bottom: parent.bottom // panel is always anchored to the bottom only, because dynamically switching between bottom and top results in stretching the height anchors.bottomMargin: hugBottom ? 0 : parent.height - (viewModeButton.y + viewModeButton.height + height + UM.Theme.getSize("default_margin").height) anchors.left: viewModeButton.left; anchors.leftMargin: hugBottom ? viewModeButton.width + UM.Theme.getSize("default_margin").width : 0 + property var buttonTarget: Qt.point(viewModeButton.x + viewModeButton.width / 2, viewModeButton.y + viewModeButton.height / 2) + height: childrenRect.height; source: UM.ActiveView.valid ? UM.ActiveView.activeViewPanel : ""; From b9241e807028f51310d10d25c86a0d97733ad6e6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 22 Jun 2017 16:13:33 +0200 Subject: [PATCH 045/379] PluginBrowser now retrieves list of plugins from the server CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 44 ++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 56833ed44e..b8ef535034 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -1,10 +1,13 @@ # Copyright (c) 2017 Ultimaker B.V. # PluginBrowser is released under the terms of the AGPLv3 or higher. - - from UM.Extension import Extension from UM.i18n import i18nCatalog +from UM.Logger import Logger +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest +from PyQt5.QtCore import QUrl + +import json i18n_catalog = i18nCatalog("cura") @@ -13,6 +16,41 @@ class PluginBrowser(Extension): def __init__(self): super().__init__() self.addMenuItem(i18n_catalog.i18n("Browse plugins"), self.browsePlugins) + self._api_version = 1 + self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version + + self._plugin_list_request = None + self._network_manager = None + + self._plugins_metadata = [] def browsePlugins(self): - pass \ No newline at end of file + self._createNetworkManager() + self.requestPluginList() + #TODO: Show popup with populated plugin data. + + def requestPluginList(self): + url = QUrl(self._api_url + "plugins") + self._plugin_list_request = QNetworkRequest(url) + self._network_manager.get(self._plugin_list_request) + + def _onRequestFinished(self, reply): + reply_url = reply.url().toString() + if reply.operation() == QNetworkAccessManager.GetOperation: + if reply_url == self._api_url + "plugins": + try: + json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) + self._plugins_metadata = json_data + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid print job state message: Not valid JSON.") + return + else: + # Ignore any operation that is not a get operation + pass + + def _createNetworkManager(self): + if self._network_manager: + self._network_manager.finished.disconnect(self._onRequestFinished) + + self._network_manager = QNetworkAccessManager() + self._network_manager.finished.connect(self._onRequestFinished) \ No newline at end of file From 8f1608bc3bf3817e7a416b37fb4b37f59d7fae6b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 22 Jun 2017 17:25:48 +0200 Subject: [PATCH 046/379] Added model to PluginBrowser We need the model to display items in the popup view. CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 36 +++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index b8ef535034..cd1c30aaff 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -3,17 +3,19 @@ from UM.Extension import Extension from UM.i18n import i18nCatalog from UM.Logger import Logger +from UM.Qt.ListModel import ListModel +from UM.PluginRegistry import PluginRegistry from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal import json i18n_catalog = i18nCatalog("cura") -class PluginBrowser(Extension): - def __init__(self): +class PluginBrowser(QObject, Extension): + def __init__(self, parent = None): super().__init__() self.addMenuItem(i18n_catalog.i18n("Browse plugins"), self.browsePlugins) self._api_version = 1 @@ -23,6 +25,9 @@ class PluginBrowser(Extension): self._network_manager = None self._plugins_metadata = [] + self._plugins_model = None + + pluginsMetadataChanged = pyqtSignal() def browsePlugins(self): self._createNetworkManager() @@ -34,6 +39,30 @@ class PluginBrowser(Extension): self._plugin_list_request = QNetworkRequest(url) self._network_manager.get(self._plugin_list_request) + @pyqtProperty(QObject, notify=pluginsMetadataChanged) + def pluginsModel(self): + if self._plugins_model is None: + self._plugins_model = ListModel() + self._plugins_model.addRoleName(Qt.UserRole + 1, "name") + self._plugins_model.addRoleName(Qt.UserRole + 2, "version") + self._plugins_model.addRoleName(Qt.UserRole + 3, "short_description") + self._plugins_model.addRoleName(Qt.UserRole + 4, "author") + self._plugins_model.addRoleName(Qt.UserRole + 5, "already_installed") + else: + self._plugins_model.clear() + items = [] + plugin_registry = PluginRegistry.getInstance() + for metadata in self._plugins_metadata: + items.append({ + "name": metadata["label"], + "version": metadata["version"], + "short_description": metadata["short_description"], + "author": metadata["author"], + "already_installed": plugin_registry.getMetaData(metadata["id"]) != {} + }) + self._plugins_model.setItems(items) + return self._plugins_model + def _onRequestFinished(self, reply): reply_url = reply.url().toString() if reply.operation() == QNetworkAccessManager.GetOperation: @@ -41,6 +70,7 @@ class PluginBrowser(Extension): try: json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) self._plugins_metadata = json_data + self.pluginsMetadataChanged.emit() except json.decoder.JSONDecodeError: Logger.log("w", "Received an invalid print job state message: Not valid JSON.") return From 503aa00137790bce39d53f13fcd72b722f8ca14e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 22 Jun 2017 17:55:45 +0200 Subject: [PATCH 047/379] Added rough dialog for the PluginBrowser CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 29 ++++++++++++++++++-- plugins/PluginBrowser/PluginBrowser.qml | 36 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 plugins/PluginBrowser/PluginBrowser.qml diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index cd1c30aaff..9fd75a92fc 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -5,18 +5,21 @@ from UM.i18n import i18nCatalog from UM.Logger import Logger from UM.Qt.ListModel import ListModel from UM.PluginRegistry import PluginRegistry +from UM.Application import Application from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal +from PyQt5.QtQml import QQmlComponent, QQmlContext import json +import os i18n_catalog = i18nCatalog("cura") class PluginBrowser(QObject, Extension): def __init__(self, parent = None): - super().__init__() + super().__init__(parent) self.addMenuItem(i18n_catalog.i18n("Browse plugins"), self.browsePlugins) self._api_version = 1 self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version @@ -27,18 +30,40 @@ class PluginBrowser(QObject, Extension): self._plugins_metadata = [] self._plugins_model = None + self._qml_component = None + self._qml_context = None + self._dialog = None + pluginsMetadataChanged = pyqtSignal() def browsePlugins(self): self._createNetworkManager() self.requestPluginList() - #TODO: Show popup with populated plugin data. + + if not self._dialog: + self._createDialog() + self._dialog.show() def requestPluginList(self): url = QUrl(self._api_url + "plugins") self._plugin_list_request = QNetworkRequest(url) self._network_manager.get(self._plugin_list_request) + def _createDialog(self): + Logger.log("d", "PluginBrowser") + + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "PluginBrowser.qml")) + self._qml_component = QQmlComponent(Application.getInstance()._engine, path) + + # We need access to engine (although technically we can't) + self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._qml_context.setContextProperty("manager", self) + self._dialog = self._qml_component.create(self._qml_context) + if self._dialog is None: + Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) + Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) + + @pyqtProperty(QObject, notify=pluginsMetadataChanged) def pluginsModel(self): if self._plugins_model is None: diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml new file mode 100644 index 0000000000..5f666a0148 --- /dev/null +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -0,0 +1,36 @@ +import UM 1.1 as UM +import QtQuick 2.2 +import QtQuick.Dialogs 1.1 +import QtQuick.Window 2.2 +import QtQuick.Controls 1.1 + +UM.Dialog +{ + id: base + + title: "YAY" + width: 450 + height: 150 + ListView + { + model: manager.pluginsModel + anchors.fill: parent + delegate: Row + { + width: parent.width + Button + { + text: model.name + } + Button + { + text: model.author + } + + Label + { + text: model.short_description + } + } + } +} \ No newline at end of file From 8a887915ac778479daf8034f65295e151ba5c258 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 22 Jun 2017 18:07:34 +0200 Subject: [PATCH 048/379] Add tab navigation to sidebar --- resources/qml/Settings/SettingCheckBox.qml | 7 +++++++ resources/qml/Settings/SettingTextField.qml | 1 + 2 files changed, 8 insertions(+) diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 97a72a026e..2a41f80d2c 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -17,6 +17,7 @@ SettingItem id: control anchors.fill: parent hoverEnabled: true + activeFocusOnTab: true property bool checked: { @@ -49,6 +50,12 @@ SettingItem } } + Keys.onSpacePressed: + { + forceActiveFocus(); + propertyProvider.setPropertyValue("value", !checked); + } + onClicked: { forceActiveFocus(); diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 059980bba2..9ab23ad7c8 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -82,6 +82,7 @@ SettingItem right: parent.right verticalCenter: parent.verticalCenter } + activeFocusOnTab: true Keys.onReleased: { From fc96dfec4e741b0f59da6072fd2c8363e7ea5f18 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 11:17:34 +0200 Subject: [PATCH 049/379] Expose approximateMaterialDiameter of the definition This way we can request that from QML. Contributes to issue CURA-2822. --- cura/Settings/GlobalStack.py | 15 +++++++++++++++ tests/Settings/TestGlobalStack.py | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 9dfb8523b3..964551f263 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -107,6 +107,21 @@ class GlobalStack(CuraContainerStack): def setNextStack(self, next_stack: ContainerStack) -> None: raise Exceptions.InvalidOperationError("Global stack cannot have a next stack!") + ## Gets the approximate filament diameter that the machine requires. + # + # The approximate material diameter is the material diameter rounded to + # the nearest millimetre. + # + # If the machine has no requirement for the diameter, -1 is returned. + # + # \return The approximate filament diameter for the printer, as a string. + @pyqtProperty(str) + def approximateMaterialDiameter(self) -> str: + material_diameter = self.definition.getMetaDataEntry("material_diameter") + if material_diameter is None: + return "-1" + return str(round(float(self.definition.getMetaDataEntry("material_diameter")))) #Round, then convert back to string. + # protected: # Determine whether or not we should try to get the "resolve" property instead of the diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index 6dab02b220..3cac17fa3a 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -86,6 +86,28 @@ def test_addExtruder(global_stack): # global_stack.addExtruder(unittest.mock.MagicMock()) assert len(global_stack.extruders) == 2 #Didn't add the faulty extruder. +## Tests getting the approximate material diameter. +@pytest.mark.parametrize("diameter, approximate_diameter", [ + #Some real-life cases that are common in printers. + (2.85, 3), + (1.75, 2), + (3.0, 3), + (2.0, 2), + #Exceptional cases. + (0, 0), + (-10.1, -10), + (-1, -1) +]) +def test_approximateMaterialDiameter(diameter, approximate_diameter, global_stack): + global_stack.definition = DefinitionContainer(container_id = "TestDefinition") + global_stack.definition._metadata["material_diameter"] = str(diameter) + assert float(global_stack.approximateMaterialDiameter) == approximate_diameter + +## Tests getting the material diameter when there is no material diameter. +def test_approximateMaterialDiameterNoDiameter(global_stack): + global_stack.definition = DefinitionContainer(container_id = "TestDefinition") + assert global_stack.approximateMaterialDiameter == "-1" + #Tests setting user changes profiles to invalid containers. @pytest.mark.parametrize("container", [ getInstanceContainer(container_type = "wrong container type"), From 121bf5897d1c4462a5142b345302bf992f0da4cf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 11:20:50 +0200 Subject: [PATCH 050/379] Deprecate _updateMaterialContainer There are better alternatives nowadays. Discovered during CURA-2822. --- cura/Settings/MachineManager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index d0c04cd26a..a150e94e76 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -11,6 +11,7 @@ from UM.Application import Application from UM.Preferences import Preferences from UM.Logger import Logger from UM.Message import Message +from UM.Decorators import deprecated from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack @@ -1121,6 +1122,7 @@ class MachineManager(QObject): def createMachineManager(engine=None, script_engine=None): return MachineManager() + @deprecated #Use ExtruderStack.material = ... and it won't be necessary. def _updateMaterialContainer(self, definition: "DefinitionContainer", stack: "ContainerStack", variant_container: Optional["InstanceContainer"] = None, preferred_material_name: Optional[str] = None): if not definition.getMetaDataEntry("has_materials"): return self._empty_material_container From b37fa6f7184e75c373dea734918bd71baa56e821 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 12:01:42 +0200 Subject: [PATCH 051/379] Implement warning message when you change material diameter The undo functionality currently gives an error though. Investigating... Contributes to issue CURA-2822. --- cura/CuraApplication.py | 11 ++++- cura/Settings/MaterialManager.py | 56 ++++++++++++++++++++++ resources/qml/Preferences/MaterialView.qml | 9 +++- 3 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 cura/Settings/MaterialManager.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7995c77fce..332b103502 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1,5 +1,6 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. + from PyQt5.QtNetwork import QLocalServer from PyQt5.QtNetwork import QLocalSocket @@ -62,6 +63,7 @@ from . import CameraImageProvider from . import MachineActionManager from cura.Settings.MachineManager import MachineManager +from cura.Settings.MaterialManager import MaterialManager from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.UserChangesModel import UserChangesModel from cura.Settings.ExtrudersModel import ExtrudersModel @@ -189,6 +191,7 @@ class CuraApplication(QtApplication): self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_manager = None # This is initialized on demand. + self._material_manager = None self._setting_inheritance_manager = None self._additional_components = {} # Components to add to certain areas in the interface @@ -640,6 +643,7 @@ class CuraApplication(QtApplication): # Initialise extruder so as to listen to global container stack changes before the first global container stack is set. ExtruderManager.getInstance() qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) + qmlRegisterSingletonType(MaterialManager, "Cura", 1, 0, "MaterialManager", self.getMaterialManager) qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", self.getSettingInheritanceManager) @@ -665,6 +669,11 @@ class CuraApplication(QtApplication): self._machine_manager = MachineManager.createMachineManager() return self._machine_manager + def getMaterialManager(self, *args): + if self._material_manager is None: + self._material_manager = MaterialManager.createMaterialManager() + return self._material_manager + def getSettingInheritanceManager(self, *args): if self._setting_inheritance_manager is None: self._setting_inheritance_manager = SettingInheritanceManager.createSettingInheritanceManager() diff --git a/cura/Settings/MaterialManager.py b/cura/Settings/MaterialManager.py new file mode 100644 index 0000000000..88baf9419b --- /dev/null +++ b/cura/Settings/MaterialManager.py @@ -0,0 +1,56 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from PyQt5.QtCore import QObject, pyqtSlot #To expose data to QML. + +from UM.Logger import Logger +from UM.Message import Message #To create a warning message about material diameter. +from UM.i18n import i18nCatalog #Translated strings. +from UM.Settings.ContainerRegistry import ContainerRegistry #To find the material containers we need. + +catalog = i18nCatalog("cura") + +## Handles material-related data, processing requests to change them and +# providing data for the GUI. +# +# TODO: Move material-related managing over from the machine manager to here. +class MaterialManager(QObject): + ## Creates the global values for the material manager to use. + def __init__(self, parent = None): + super().__init__(parent) + + #Material diameter changed warning message. + self._material_diameter_warning_message = Message(catalog.i18nc("@info:status Has a cancel button next to it.", + "The selected material diameter causes the material to become incompatible with the current printer.")) + self._material_diameter_warning_message.addAction("Undo", catalog.i18nc("@action:button", "Undo"), None, catalog.i18nc("@action", "Undo changing the material diameter.")) + self._material_diameter_warning_message.actionTriggered = self._materialWarningMessageAction + + ## Creates an instance of the MaterialManager. + # + # This should only be called by PyQt to create the singleton instance of + # this class. + @staticmethod + def createMaterialManager(engine = None, script_engine = None): + return MaterialManager() + + @pyqtSlot(str, str) + def showMaterialWarningMessage(self, material_id, previous_diameter): + self._material_diameter_warning_message.previous_diameter = previous_diameter #Make sure that the undo button can properly undo the action. + self._material_diameter_warning_message.material_id = material_id + self._material_diameter_warning_message.show() + + ## Called when clicking "undo" on the warning dialogue for disappeared + # materials. + # + # This executes the undo action, restoring the material diameter. + # + # \param button The identifier of the button that was pressed. + def _materialWarningMessageAction(self, button): + if button == "Undo": + container_registry = ContainerRegistry.getInstance() + matches = container_registry.findInstanceContainers(type = "material", id = self._material_diameter_warning_message.material_id) + if matches: + matches[0].setMetaDataEntry("diameter", self._material_diameter_warning_message.previous_diameter) + #No matches? Then the material has been deleted in the meanwhile. + else: + Logger.log("w", "Unknown button action for material diameter warning message: {action}".format(action = button)) \ No newline at end of file diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 30edb063c1..8942549265 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -1,5 +1,5 @@ -// Copyright (c) 2016 Ultimaker B.V. -// Uranium is released under the terms of the AGPLv3 or higher. +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. import QtQuick 2.1 import QtQuick.Controls 1.3 @@ -168,8 +168,13 @@ TabView { // This does not use a SettingPropertyProvider, because we need to make the change to all containers // which derive from the same base_file + var old_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties/diameter"); base.setMetaDataEntry("approximate_diameter", properties.approximate_diameter, Math.round(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); + if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Math.round(Cura.MachineManager.activeMachine.approximateMaterialDiameter).toString()) + { + Cura.MaterialManager.showMaterialWarningMessage(base.containerId, old_diameter); + } Cura.ContainerManager.setContainerProperty(base.containerId, "material_diameter", "value", value); } onValueChanged: updateCostPerMeter() From c192d37daaf3ed656754703c55b4634de6fcf817 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 12:28:00 +0200 Subject: [PATCH 052/379] Fix connecting undo action to undo button Also hiding the message afterwards. Apparently that's not done automatically. Contributes to issue CURA-2822. --- cura/Settings/MaterialManager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Settings/MaterialManager.py b/cura/Settings/MaterialManager.py index 88baf9419b..c204847fff 100644 --- a/cura/Settings/MaterialManager.py +++ b/cura/Settings/MaterialManager.py @@ -23,7 +23,7 @@ class MaterialManager(QObject): self._material_diameter_warning_message = Message(catalog.i18nc("@info:status Has a cancel button next to it.", "The selected material diameter causes the material to become incompatible with the current printer.")) self._material_diameter_warning_message.addAction("Undo", catalog.i18nc("@action:button", "Undo"), None, catalog.i18nc("@action", "Undo changing the material diameter.")) - self._material_diameter_warning_message.actionTriggered = self._materialWarningMessageAction + self._material_diameter_warning_message.actionTriggered.connect(self._materialWarningMessageAction) ## Creates an instance of the MaterialManager. # @@ -45,12 +45,13 @@ class MaterialManager(QObject): # This executes the undo action, restoring the material diameter. # # \param button The identifier of the button that was pressed. - def _materialWarningMessageAction(self, button): + def _materialWarningMessageAction(self, message, button): if button == "Undo": container_registry = ContainerRegistry.getInstance() matches = container_registry.findInstanceContainers(type = "material", id = self._material_diameter_warning_message.material_id) if matches: matches[0].setMetaDataEntry("diameter", self._material_diameter_warning_message.previous_diameter) #No matches? Then the material has been deleted in the meanwhile. + message.hide() else: Logger.log("w", "Unknown button action for material diameter warning message: {action}".format(action = button)) \ No newline at end of file From f0414734656a32f76b4938ced046d27d37618d75 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 12:40:45 +0200 Subject: [PATCH 053/379] Fix applying material diameter undo Somehow it seems to get the wrong value there though. Debugging that next... Contributes to issue CURA-2822. --- cura/Settings/MaterialManager.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cura/Settings/MaterialManager.py b/cura/Settings/MaterialManager.py index c204847fff..abfafc5f9f 100644 --- a/cura/Settings/MaterialManager.py +++ b/cura/Settings/MaterialManager.py @@ -3,10 +3,10 @@ from PyQt5.QtCore import QObject, pyqtSlot #To expose data to QML. +from cura.Settings.ContainerManager import ContainerManager from UM.Logger import Logger from UM.Message import Message #To create a warning message about material diameter. from UM.i18n import i18nCatalog #Translated strings. -from UM.Settings.ContainerRegistry import ContainerRegistry #To find the material containers we need. catalog = i18nCatalog("cura") @@ -47,11 +47,8 @@ class MaterialManager(QObject): # \param button The identifier of the button that was pressed. def _materialWarningMessageAction(self, message, button): if button == "Undo": - container_registry = ContainerRegistry.getInstance() - matches = container_registry.findInstanceContainers(type = "material", id = self._material_diameter_warning_message.material_id) - if matches: - matches[0].setMetaDataEntry("diameter", self._material_diameter_warning_message.previous_diameter) - #No matches? Then the material has been deleted in the meanwhile. + container_manager = ContainerManager.getInstance() + container_manager.setContainerMetaDataEntry(self._material_diameter_warning_message.material_id, "properties/diameter", self._material_diameter_warning_message.previous_diameter) message.hide() else: Logger.log("w", "Unknown button action for material diameter warning message: {action}".format(action = button)) \ No newline at end of file From 7ea1d4cc5a07840c08d130180e217ea1e360226d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 13:50:35 +0200 Subject: [PATCH 054/379] Add getContainerProperty function The opposite of setContainerProperty. Contributes to issue CURA-2822. --- cura/Settings/ContainerManager.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 1fcdbc5a20..9a2282c8c0 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -235,7 +235,7 @@ class ContainerManager(QObject): return True - ## Set a setting property value of the specified container. + ## Set a setting property of the specified container. # # This will set the specified property of the specified setting of the container # and all containers that share the same base_file (if any). The latter only @@ -269,6 +269,29 @@ class ContainerManager(QObject): return True + ## Get a setting property of the specified container. + # + # This will get the specified property of the specified setting of the + # specified container. + # + # \param container_id The ID of the container to get the setting property + # of. + # \param setting_key The key of the setting to get the property of. + # \param property_name The property to obtain. + # \return The value of the specified property. The type of this property + # value depends on the type of the property. For instance, the "value" + # property of an integer setting will be a Python int, but the "value" + # property of an enum setting will be a Python str. + @pyqtSlot(str, str, str, result = QVariant) + def getContainerProperty(self, container_id: str, setting_key: str, property_name: str): + containers = self._container_registry.findContainers(id = container_id) + if not containers: + Logger.log("w", "Could not get properties of container %s because it was not found.", container_id) + return "" + container = containers[0] + + return container.getProperty(setting_key, property_name) + ## Set the name of the specified container. @pyqtSlot(str, str, result = bool) def setContainerName(self, container_id, new_name): From 1d048f39db189954bf2f74c40028fbeff28b1269 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 13:51:40 +0200 Subject: [PATCH 055/379] Fix getting old material diameter This diameter works. I still don't know why the properties/diameter one didn't work, but this is good too since they are now equal. Contributes to issue CURA-2822. --- resources/qml/Preferences/MaterialView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 8942549265..990f03b5cc 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -168,7 +168,7 @@ TabView { // This does not use a SettingPropertyProvider, because we need to make the change to all containers // which derive from the same base_file - var old_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties/diameter"); + var old_diameter = Cura.ContainerManager.getContainerProperty(base.containerId, "material_diameter", "value").toString(); base.setMetaDataEntry("approximate_diameter", properties.approximate_diameter, Math.round(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Math.round(Cura.MachineManager.activeMachine.approximateMaterialDiameter).toString()) From 0e23930bfefd7ac4df5de6a0db917200b08816d4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 14:43:45 +0200 Subject: [PATCH 056/379] Fix checking whether the old material diameter was the same Getting the old material diameter wasn't working properly. Contributes to issue CURA-2822. --- cura/Settings/GlobalStack.py | 4 ++-- resources/qml/Preferences/MaterialView.qml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 964551f263..4e7bcdf486 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -117,10 +117,10 @@ class GlobalStack(CuraContainerStack): # \return The approximate filament diameter for the printer, as a string. @pyqtProperty(str) def approximateMaterialDiameter(self) -> str: - material_diameter = self.definition.getMetaDataEntry("material_diameter") + material_diameter = self.definition.getProperty("material_diameter", "value") if material_diameter is None: return "-1" - return str(round(float(self.definition.getMetaDataEntry("material_diameter")))) #Round, then convert back to string. + return str(round(float(material_diameter))) #Round, then convert back to string. # protected: diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 990f03b5cc..39f2db0695 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -171,7 +171,7 @@ TabView var old_diameter = Cura.ContainerManager.getContainerProperty(base.containerId, "material_diameter", "value").toString(); base.setMetaDataEntry("approximate_diameter", properties.approximate_diameter, Math.round(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); - if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Math.round(Cura.MachineManager.activeMachine.approximateMaterialDiameter).toString()) + if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Cura.MachineManager.activeMachine.approximateMaterialDiameter) { Cura.MaterialManager.showMaterialWarningMessage(base.containerId, old_diameter); } From bc219a06fec6141609e6a4bd1530369aaabffbab Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Jun 2017 17:21:11 +0200 Subject: [PATCH 057/379] Add MaterialsModel to make material list update upon metadata change This new model inherits from InstanceContainersModel. The only change is that it updates when the metadata of a material container changes. This is needed to make the list of materials update when the material diameter changes. Contributes to issue CURA-2822. --- cura/CuraApplication.py | 2 ++ cura/Settings/MaterialsModel.py | 21 +++++++++++++++++++++ resources/qml/Preferences/MaterialsPage.qml | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 cura/Settings/MaterialsModel.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 332b103502..a1f5aaa6de 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -48,6 +48,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingFunction import SettingFunction from cura.Settings.MachineNameValidator import MachineNameValidator from cura.Settings.ProfilesModel import ProfilesModel +from cura.Settings.MaterialsModel import MaterialsModel from cura.Settings.QualityAndUserProfilesModel import QualityAndUserProfilesModel from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.UserProfilesModel import UserProfilesModel @@ -717,6 +718,7 @@ class CuraApplication(QtApplication): qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) + qmlRegisterType(MaterialsModel, "Cura", 1, 0, "MaterialsModel") qmlRegisterType(QualityAndUserProfilesModel, "Cura", 1, 0, "QualityAndUserProfilesModel") qmlRegisterType(UserProfilesModel, "Cura", 1, 0, "UserProfilesModel") qmlRegisterType(MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") diff --git a/cura/Settings/MaterialsModel.py b/cura/Settings/MaterialsModel.py new file mode 100644 index 0000000000..75eeb6c281 --- /dev/null +++ b/cura/Settings/MaterialsModel.py @@ -0,0 +1,21 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.Settings.ContainerRegistry import ContainerRegistry #To listen for changes to the materials. +from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel #We're extending this class. + +## A model that shows a list of currently valid materials. +class MaterialsModel(InstanceContainersModel): + def __init__(self, parent = None): + super().__init__(parent) + + ContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerMetaDataChanged) + + ## Called when the metadata of the container was changed. + # + # This makes sure that we only update when it was a material that changed. + # + # \param container The container whose metadata was changed. + def _onContainerMetaDataChanged(self, container): + if container.getMetaDataEntry("type") == "material": #Only need to update if a material was changed. + self._update() \ No newline at end of file diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 0921b8c7c2..e5051dd5d3 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -20,7 +20,7 @@ UM.ManagementPage objectList.positionViewAtBeginning(); } - model: UM.InstanceContainersModel + model: Cura.MaterialsModel { filter: { From b324e90ba5468b19070d4d1536d288572d276df1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 22 Jun 2017 18:33:30 +0200 Subject: [PATCH 058/379] Show hover state on active focus --- resources/qml/Settings/SettingCheckBox.qml | 20 +++++++++++----- resources/qml/Settings/SettingComboBox.qml | 24 ++++++++++++------- resources/qml/Settings/SettingExtruder.qml | 14 ++++------- .../qml/Settings/SettingOptionalExtruder.qml | 16 +++++-------- resources/qml/Settings/SettingTextField.qml | 15 ++++++++++-- resources/themes/cura/styles.qml | 6 ++--- 6 files changed, 57 insertions(+), 38 deletions(-) diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 2a41f80d2c..07b1f865be 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -74,7 +74,7 @@ SettingItem color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled") } @@ -82,14 +82,22 @@ SettingItem { return UM.Theme.getColor("setting_control_highlight") } - else - { - return UM.Theme.getColor("setting_control") - } + return UM.Theme.getColor("setting_control") } border.width: UM.Theme.getSize("default_lining").width - border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + border.color: + { + if(!enabled) + { + return UM.Theme.getColor("setting_control_disabled_border") + } + if(control.containsMouse || control.activeFocus) + { + return UM.Theme.getColor("setting_control_border_highlight") + } + return UM.Theme.getColor("setting_control_border") + } UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index c655630a8e..4c14d2032b 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -33,21 +33,29 @@ SettingItem { color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled") } - if(control.hovered || base.activeFocus) + if(control.hovered || control.activeFocus) { return UM.Theme.getColor("setting_control_highlight") } - else - { - return UM.Theme.getColor("setting_control") - } + return UM.Theme.getColor("setting_control") + } + border.width: UM.Theme.getSize("default_lining").width + border.color: + { + if(!enabled) + { + return UM.Theme.getColor("setting_control_disabled_border") + } + if(control.hovered || control.activeFocus) + { + return UM.Theme.getColor("setting_control_border_highlight") + } + return UM.Theme.getColor("setting_control_border") } - border.width: UM.Theme.getSize("default_lining").width; - border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border"); } label: Item { diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index 4a946d16f8..b00b6774be 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -53,7 +53,7 @@ SettingItem { color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled"); } @@ -61,23 +61,19 @@ SettingItem { return UM.Theme.getColor("setting_control_highlight"); } - else - { - return UM.Theme.getColor("setting_control"); - } + return UM.Theme.getColor("setting_control"); } border.width: UM.Theme.getSize("default_lining").width border.color: { if(!enabled) { - return UM.Theme.getColor("setting_control_disabled_border"); + return UM.Theme.getColor("setting_control_disabled_border") } - if(control.hovered || base.activeFocus) + if(control.hovered || control.activeFocus) { - UM.Theme.getColor("setting_control_border_highlight") + return UM.Theme.getColor("setting_control_border_highlight") } - return UM.Theme.getColor("setting_control_border") } } diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index 1f546b518c..e2ca20571c 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -72,31 +72,27 @@ SettingItem { color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled"); } - if(control.hovered || base.activeFocus) + if(control.hovered || control.activeFocus) { return UM.Theme.getColor("setting_control_highlight"); } - else - { - return UM.Theme.getColor("setting_control"); - } + return UM.Theme.getColor("setting_control"); } border.width: UM.Theme.getSize("default_lining").width border.color: { if(!enabled) { - return UM.Theme.getColor("setting_control_disabled_border"); + return UM.Theme.getColor("setting_control_disabled_border") } - if(control.hovered || base.activeFocus) + if(control.hovered || control.activeFocus) { - UM.Theme.getColor("setting_control_border_highlight") + return UM.Theme.getColor("setting_control_border_highlight") } - return UM.Theme.getColor("setting_control_border") } } diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 9ab23ad7c8..b9f11ea80d 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -17,10 +17,21 @@ SettingItem anchors.fill: parent border.width: UM.Theme.getSize("default_lining").width - border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + border.color: + { + if(!enabled) + { + return UM.Theme.getColor("setting_control_disabled_border") + } + if(hovered || input.activeFocus) + { + return UM.Theme.getColor("setting_control_border_highlight") + } + return UM.Theme.getColor("setting_control_border") + } color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled") } diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 496cc8e489..c4c441da43 100755 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -368,11 +368,11 @@ QtObject { color: { if(!control.enabled) { return Theme.getColor("setting_category_disabled_border"); - } else if(control.hovered && control.checkable && control.checked) { + } else if((control.hovered || control.activeFocus) && control.checkable && control.checked) { return Theme.getColor("setting_category_active_hover_border"); } else if(control.pressed || (control.checkable && control.checked)) { return Theme.getColor("setting_category_active_border"); - } else if(control.hovered) { + } else if(control.hovered || control.activeFocus) { return Theme.getColor("setting_category_hover_border"); } else { return Theme.getColor("setting_category_border"); @@ -508,7 +508,7 @@ QtObject { { color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled"); } From 67a4ec2a9e56ba6df31fa06efe49a69aa1b2d20f Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 22 Jun 2017 18:56:55 +0200 Subject: [PATCH 059/379] dark layer view --- resources/themes/cura-dark/theme.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 559671dfeb..23cc30579e 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -181,6 +181,19 @@ "convex_hull": [35, 35, 35, 127], "disallowed_area": [0, 0, 0, 40], - "error_area": [255, 0, 0, 127] + "error_area": [255, 0, 0, 127], + + "layerview_ghost": [32, 32, 32, 96], + "layerview_none": [255, 255, 255, 255], + "layerview_inset_0": [155, 0, 0, 255], + "layerview_inset_x": [0, 155, 0, 255], + "layerview_skin": [155, 155, 0, 255], + "layerview_support": [0, 155, 155, 255], + "layerview_skirt": [0, 155, 155, 255], + "layerview_infill": [155, 117, 0, 255], + "layerview_support_infill": [0, 155, 155, 255], + "layerview_move_combing": [0, 0, 155, 255], + "layerview_move_retraction": [77, 77, 155, 255], + "layerview_support_interface": [39, 117, 155, 255] } } From b958e30fe6b5f175af85055250c563c49e2535f0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 21 Jun 2017 14:50:40 +0200 Subject: [PATCH 060/379] Add machine_disallowed_areas and turn off nozzle offsetting for disallowed areas calculation CURA-3663 We don't need to calculate the disallowed areas for certain machines because they have taken into account the nozzle offsets. This commit does the following: - Add machine_disallowed_areas - Add a flag in definition so that disallowed areas calculation with nozzle offsets becomes optional in Cura. Update documentation for no offsetting for nozzles Contributes to issue CURA-3663. --- cura/BuildVolume.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index ff5888b722..4963df65cd 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -716,6 +716,11 @@ class BuildVolume(SceneNode): polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size)) machine_disallowed_polygons.append(polygon) + # For certain machines we don't need to compute disallowed areas for each nozzle. + # So we check here and only do the nozzle offsetting if needed. + no_nozzle_offsetting_for_disallowed_areas = self._global_container_stack.getMetaDataEntry( + "no_nozzle_offsetting_for_disallowed_areas", False) + result = {} for extruder in used_extruders: extruder_id = extruder.getId() @@ -735,14 +740,17 @@ class BuildVolume(SceneNode): right_unreachable_border = 0 top_unreachable_border = 0 bottom_unreachable_border = 0 - #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. - for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): - other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") - other_offset_y = other_extruder.getProperty("machine_nozzle_offset_y", "value") - left_unreachable_border = min(left_unreachable_border, other_offset_x - offset_x) - right_unreachable_border = max(right_unreachable_border, other_offset_x - offset_x) - top_unreachable_border = min(top_unreachable_border, other_offset_y - offset_y) - bottom_unreachable_border = max(bottom_unreachable_border, other_offset_y - offset_y) + + # Only do nozzle offsetting if needed + if not no_nozzle_offsetting_for_disallowed_areas: + #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. + for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): + other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") + other_offset_y = other_extruder.getProperty("machine_nozzle_offset_y", "value") + left_unreachable_border = min(left_unreachable_border, other_offset_x - offset_x) + right_unreachable_border = max(right_unreachable_border, other_offset_x - offset_x) + top_unreachable_border = min(top_unreachable_border, other_offset_y - offset_y) + bottom_unreachable_border = max(bottom_unreachable_border, other_offset_y - offset_y) half_machine_width = self._global_container_stack.getProperty("machine_width", "value") / 2 half_machine_depth = self._global_container_stack.getProperty("machine_depth", "value") / 2 From 13c9519a7c7cec619b4d36275193f706bfb37e8c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 09:42:08 +0200 Subject: [PATCH 061/379] Fix deprecated decorator Contributes to issue CURA-2822. --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a150e94e76..8aa060896a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1122,7 +1122,7 @@ class MachineManager(QObject): def createMachineManager(engine=None, script_engine=None): return MachineManager() - @deprecated #Use ExtruderStack.material = ... and it won't be necessary. + @deprecated("Use ExtruderStack.material = ... and it won't be necessary", "2.7") def _updateMaterialContainer(self, definition: "DefinitionContainer", stack: "ContainerStack", variant_container: Optional["InstanceContainer"] = None, preferred_material_name: Optional[str] = None): if not definition.getMetaDataEntry("has_materials"): return self._empty_material_container From 3049fb4da2068ed1a7ecd6c480ec9c3718d6c211 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 09:57:07 +0200 Subject: [PATCH 062/379] Made setting warning colors for dark theme a bit darker. --- resources/themes/cura-dark/theme.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 559671dfeb..5855b59d04 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -114,8 +114,8 @@ "setting_control_disabled_text": [127, 127, 127, 255], "setting_control_disabled_border": [127, 127, 127, 255], "setting_unit": [127, 127, 127, 255], - "setting_validation_error": [255, 57, 14, 255], - "setting_validation_warning": [255, 186, 15, 255], + "setting_validation_error": [204, 37, 0, 255], + "setting_validation_warning": [204, 146, 0, 255], "setting_validation_ok": [83, 83, 83, 255], "progressbar_background": [66, 66, 66, 255], From 85bcc56a64cd747ec97ee8ab7ba59387cf9d7fb8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 11:05:33 +0200 Subject: [PATCH 063/379] Update TPU profiles These profiles are improved by the materials team. This is directly copied from them and should now be optimised for our use. Contributes to issue CURA-3960. --- .../ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg | 14 +++++++------- .../ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg | 14 +++++++------- .../um3_aa0.4_TPU_Normal_Quality.inst.cfg | 14 +++++++------- .../ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg | 10 +++++++--- .../um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 10 +++++++--- .../um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 10 +++++++--- 6 files changed, 42 insertions(+), 30 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index 3f815fac3d..8c6318a698 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -29,11 +29,11 @@ jerk_print = 25 layer_height = 0.2 line_width = =machine_nozzle_size * 0.95 machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 10 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature - 21 material_flow = 106 -material_initial_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 material_standby_temperature = 100 @@ -43,8 +43,8 @@ prime_tower_wipe_enabled = True retraction_count_max = 12 retraction_extra_prime_amount = 0.8 retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = False +retraction_hop = 1.5 +retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -61,7 +61,7 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 0.7 -travel_avoid_distance = 0.5 +travel_avoid_distance = 1.5 wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = 0.76 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index e45ec15dec..129135f6a1 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -29,11 +29,11 @@ jerk_print = 25 layer_height = 0.15 line_width = =machine_nozzle_size * 0.95 machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 10 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature - 21 material_flow = 106 -material_initial_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 material_standby_temperature = 100 @@ -44,8 +44,8 @@ retraction_amount = 7 retraction_count_max = 12 retraction_extra_prime_amount = 0.8 retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = False +retraction_hop = 1.5 +retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -62,7 +62,7 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 0.7 -travel_avoid_distance = 0.5 +travel_avoid_distance = 1.5 wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = 0.76 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index 707e535947..eb71f1ef3f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -28,11 +28,11 @@ jerk_enabled = True jerk_print = 25 line_width = =machine_nozzle_size * 0.95 machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 10 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature - 21 material_flow = 106 -material_initial_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature_layer_0 = =default_material_print_temperature material_standby_temperature = 100 multiple_mesh_overlap = 0 @@ -41,8 +41,8 @@ prime_tower_wipe_enabled = True retraction_count_max = 12 retraction_extra_prime_amount = 0.8 retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = False +retraction_hop = 1.5 +retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -59,7 +59,7 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 0.7 -travel_avoid_distance = 0.5 +travel_avoid_distance = 1.5 wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = 0.76 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 41ac43a840..33f1b7952a 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -25,8 +25,12 @@ infill_sparse_density = 80 jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) jerk_support = =math.ceil(jerk_print * 25 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 material_bed_temperature_layer_0 = 0 +material_final_print_temperature = =material_print_temperature - 21 material_flow = 105 +material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 material_standby_temperature = 100 @@ -37,8 +41,8 @@ prime_tower_wall_thickness = =prime_tower_line_width * 2 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 -retraction_hop = 0.5 -retraction_hop_enabled = False +retraction_hop = 1.5 +retraction_hop_enabled = True retraction_hop_only_when_collides = False retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -56,7 +60,7 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 -travel_avoid_distance = 0.5 +travel_avoid_distance = 1.5 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index 66c0281b78..42a819ec82 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -26,8 +26,12 @@ jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) jerk_support = =math.ceil(jerk_print * 25 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) layer_height = 0.4 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 material_bed_temperature_layer_0 = 0 +material_final_print_temperature = =material_print_temperature - 21 material_flow = 105 +material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 material_standby_temperature = 100 @@ -38,8 +42,8 @@ prime_tower_wall_thickness = =prime_tower_line_width * 2 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 -retraction_hop = 0.5 -retraction_hop_enabled = False +retraction_hop = 1.5 +retraction_hop_enabled = True retraction_hop_only_when_collides = False retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -57,7 +61,7 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 -travel_avoid_distance = 0.5 +travel_avoid_distance = 1.5 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index 1274f43eea..dd3cc8fa68 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -26,8 +26,12 @@ jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) jerk_support = =math.ceil(jerk_print * 25 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) layer_height = 0.3 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 material_bed_temperature_layer_0 = 0 +material_final_print_temperature = =material_print_temperature - 21 material_flow = 105 +material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature_layer_0 = =default_material_print_temperature + 2 material_standby_temperature = 100 multiple_mesh_overlap = 0.2 @@ -37,8 +41,8 @@ prime_tower_wall_thickness = =prime_tower_line_width * 2 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 -retraction_hop = 0.5 -retraction_hop_enabled = False +retraction_hop = 1.5 +retraction_hop_enabled = True retraction_hop_only_when_collides = False retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -56,7 +60,7 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 -travel_avoid_distance = 0.5 +travel_avoid_distance = 1.5 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) From 8ffc3eabdb7efc663aea6a9588a00ef0a4bd7689 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 11:06:46 +0200 Subject: [PATCH 064/379] Add 0.8mm profiles for CPE+ and PC These are copied directly from the materials team and should now be optimised. Contributes to issue CURA-3960. --- .../um3_aa0.8_CPEP_Draft_Print.inst.cfg | 98 +++++++++++++++++ .../um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 98 +++++++++++++++++ .../um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 98 +++++++++++++++++ .../um3_aa0.8_PC_Draft_Print.inst.cfg | 101 ++++++++++++++++++ .../um3_aa0.8_PC_Superdraft_Print.inst.cfg | 101 ++++++++++++++++++ .../um3_aa0.8_PC_Verydraft_Print.inst.cfg | 101 ++++++++++++++++++ 6 files changed, 597 insertions(+) create mode 100644 resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg new file mode 100644 index 0000000000..a40339e9c9 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg @@ -0,0 +1,98 @@ +[general] +version = 2 +name = Normal Print 0.8 +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_cpe_plus_ultimaker3_AA_0.8 +weight = -2 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 14 * layer_height +cool_fan_speed = 8 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_speed = 5 +infill_before_walls = True +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_sparse_density = 20 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +jerk_wall_x = =jerk_wall +layer_height = 0.2 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.9375 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_bed_temperature = 107 +material_print_temperature = =default_material_print_temperature - 10 +material_print_temperature_layer_0 = =material_print_temperature +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_wipe_enabled = True +retraction_amount = 6.5 +retraction_combing = off +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 0.1 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 0 +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 50 +speed_slowdown_layers = 15 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.2 +travel_avoid_distance = 1.5 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =wall_line_width +wall_thickness = 2 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..8b1fbabea8 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -0,0 +1,98 @@ +[general] +version = 2 +name = Draft Print 0.8 +definition = ultimaker3 + +[metadata] +type = quality +quality_type = superdraft +material = generic_cpe_plus_ultimaker3_AA_0.8 +weight = -2 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 7 * layer_height +cool_fan_speed = 8 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_speed = 5 +infill_before_walls = True +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_sparse_density = 20 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +jerk_wall_x = =jerk_wall +layer_height = 0.4 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.9375 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_bed_temperature = 107 +material_print_temperature = =default_material_print_temperature - 5 +material_print_temperature_layer_0 = =material_print_temperature +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = True +prime_tower_wipe_enabled = True +retraction_amount = 6.5 +retraction_combing = off +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 0.1 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 0 +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 50 +speed_slowdown_layers = 8 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.2 +travel_avoid_distance = 1.5 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =wall_line_width +wall_thickness = 2 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..a478ea8b8a --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -0,0 +1,98 @@ +[general] +version = 2 +name = Fasr Print 0.8 +definition = ultimaker3 + +[metadata] +type = quality +quality_type = verydraft +material = generic_cpe_plus_ultimaker3_AA_0.8 +weight = -1 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 9 * layer_height +cool_fan_speed = 8 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_speed = 5 +infill_before_walls = True +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_sparse_density = 20 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +jerk_wall_x = =jerk_wall +layer_height = 0.3 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.9375 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_bed_temperature = 107 +material_print_temperature = =default_material_print_temperature - 7 +material_print_temperature_layer_0 = =material_print_temperature +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = True +prime_tower_wipe_enabled = True +retraction_amount = 6.5 +retraction_combing = off +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 0.1 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 0 +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 50 +speed_slowdown_layers = 10 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.2 +travel_avoid_distance = 1.5 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =wall_line_width +wall_thickness = 2 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg new file mode 100644 index 0000000000..c03e7bc385 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg @@ -0,0 +1,101 @@ +[general] +version = 2 +name = Normal 0.8 Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_pc_ultimaker3_AA_0.8 +weight = 0 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 14 * layer_height +cool_fan_speed = 5 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_speed = 5 +infill_before_walls = True +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_sparse_density = 20 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +jerk_wall_x = =jerk_wall +layer_height = 0.2 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.875 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature = 107 +material_print_temperature = =default_material_print_temperature - 5 +material_print_temperature_layer_0 = =material_print_temperature +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_wipe_enabled = True +raft_airgap = 0.5 +raft_margin = 15 +retract_at_layer_change = True +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +skin_overlap = 0 +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 50 +speed_slowdown_layers = 15 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_pattern = zigzag +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.4 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =wall_line_width +wall_thickness = 2 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..eed4fbf3a6 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -0,0 +1,101 @@ +[general] +version = 2 +name = Draft 0.8 Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pc_ultimaker3_AA_0.8 +weight = -2 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 7 * layer_height +cool_fan_speed = 5 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_speed = 5 +infill_before_walls = True +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_sparse_density = 20 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +jerk_wall_x = =jerk_wall +layer_height = 0.4 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.875 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature = 107 +material_print_temperature = =default_material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_wipe_enabled = True +raft_airgap = 0.5 +raft_margin = 15 +retract_at_layer_change = True +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +skin_overlap = 0 +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 50 +speed_slowdown_layers = 8 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_pattern = zigzag +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.4 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =wall_line_width +wall_thickness = 2 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..c1a15d3ddc --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -0,0 +1,101 @@ +[general] +version = 2 +name = Fast 0.8 Print +definition = ultimaker3 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pc_ultimaker3_AA_0.8 +weight = -1 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 9 * layer_height +cool_fan_speed = 5 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_speed = 5 +infill_before_walls = True +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_sparse_density = 20 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +jerk_wall_x = =jerk_wall +layer_height = 0.3 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.875 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature = 107 +material_print_temperature = =default_material_print_temperature - 2 +material_print_temperature_layer_0 = =material_print_temperature +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_wipe_enabled = True +raft_airgap = 0.5 +raft_margin = 15 +retract_at_layer_change = True +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +skin_overlap = 0 +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 50 +speed_slowdown_layers = 10 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_pattern = zigzag +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.4 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =wall_line_width +wall_thickness = 2 From a8f2f6560fb4327a3e78820d80bfc33dfcd0964e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 11:07:25 +0200 Subject: [PATCH 065/379] Add PP profiles These are copied from the materials team and should now be optimised. Contributes to issue CURA-3960. --- .../um3_aa0.4_PP_Draft_Print.inst.cfg | 107 ++++++++++++++++++ .../um3_aa0.4_PP_Fast_Print.inst.cfg | 107 ++++++++++++++++++ .../um3_aa0.4_PP_Normal_Quality.inst.cfg | 107 ++++++++++++++++++ .../um3_aa0.8_PP_Draft_Print.inst.cfg | 63 +++++++++++ .../um3_aa0.8_PP_Superdraft_Print.inst.cfg | 63 +++++++++++ .../um3_aa0.8_PP_Verydraft_Print.inst.cfg | 63 +++++++++++ 6 files changed, 510 insertions(+) create mode 100644 resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg new file mode 100644 index 0000000000..3a559df3e8 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -0,0 +1,107 @@ +[general] +version = 2 +name = Fast +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_pp_ultimaker3_AA_0.4 +weight = -2 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 7 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = tetrahedral +infill_sparse_density = 20 +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height = 0.2 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature = 85 +material_bed_temperature_layer_0 = 90 +material_final_print_temperature = 205 +material_flow = 100 +material_initial_print_temperature = 210 +material_print_temperature = 215 +material_print_temperature_layer_0 = 220 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_amount = 6.5 +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 18 +retraction_speed = 35 +skin_overlap = 15 +speed_equalize_flow_enabled = True +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 300 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +speed_wall_x = =speed_wall +support_angle = 50 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.2 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg new file mode 100644 index 0000000000..23bbce605c --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -0,0 +1,107 @@ +[general] +version = 2 +name = Normal +definition = ultimaker3 + +[metadata] +type = quality +quality_type = fast +material = generic_pp_ultimaker3_AA_0.4 +weight = -1 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 7 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = tetrahedral +infill_sparse_density = 20 +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height = 0.15 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature = 85 +material_bed_temperature_layer_0 = 90 +material_final_print_temperature = 195 +material_flow = 100 +material_initial_print_temperature = 205 +material_print_temperature = 207 +material_print_temperature_layer_0 = 210 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_amount = 7 +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 18 +retraction_speed = 35 +skin_overlap = 15 +speed_equalize_flow_enabled = True +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 300 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +speed_wall_x = =speed_wall +support_angle = 50 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.1 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..e0e9fd3234 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -0,0 +1,107 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_pp_ultimaker3_AA_0.4 +weight = 0 +setting_version = 1 + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 7 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = tetrahedral +infill_sparse_density = 20 +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height = 0.1 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature = 85 +material_bed_temperature_layer_0 = 90 +material_final_print_temperature = 195 +material_flow = 100 +material_initial_print_temperature = 200 +material_print_temperature = 205 +material_print_temperature_layer_0 = 208 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_amount = 7 +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 18 +retraction_speed = 35 +skin_overlap = 15 +speed_equalize_flow_enabled = True +speed_infill = =speed_print +speed_layer_0 = 15 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 300 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +speed_wall_x = =speed_wall +support_angle = 50 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg new file mode 100644 index 0000000000..5c86daff89 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 2 +name = Fast +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_pp_ultimaker3_AA_0.8 +weight = -2 +setting_version = 1 + +[values] +brim_width = 25 +cool_fan_speed = 10 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 17 +expand_skins_expand_distance = =line_width * 2 +expand_skins_into_infill = True +expand_upper_skins = True +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = tetrahedral +infill_sparse_density = 20 +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +material_bed_temperature_layer_0 = =material_bed_temperature +material_flow = 100 +material_print_temperature = =default_material_print_temperature - 2 +material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +prime_tower_wall_thickness = =prime_tower_line_width * 2 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 0.5 +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) +skin_overlap = 5 +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 25 / 35) +speed_travel = 300 +speed_wall = =math.ceil(speed_print * 30 / 35) +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_angle = 60 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.6 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) +wall_thickness = 1.6 + diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..7dd422b300 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 2 +name = Sprint +definition = ultimaker3 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pp_ultimaker3_AA_0.8 +weight = -4 +setting_version = 1 + +[values] +brim_width = 25 +cool_fan_speed = 10 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 17 +expand_skins_expand_distance = =line_width * 2 +expand_skins_into_infill = True +expand_upper_skins = True +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = tetrahedral +infill_sparse_density = 20 +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +material_bed_temperature_layer_0 = =material_bed_temperature +material_flow = 100 +material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +prime_tower_wall_thickness = =prime_tower_line_width * 2 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 0.5 +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) +skin_overlap = 5 +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 25 / 35) +speed_travel = 300 +speed_wall = =math.ceil(speed_print * 30 / 35) +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_angle = 60 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.6 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) +wall_thickness = 1.6 + diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..00958e7381 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 2 +name = Extra Fast +definition = ultimaker3 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pp_ultimaker3_AA_0.8 +weight = -3 +setting_version = 1 + +[values] +brim_width = 25 +cool_fan_speed = 10 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 17 +expand_skins_expand_distance = =line_width * 2 +expand_skins_into_infill = True +expand_upper_skins = True +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = tetrahedral +infill_sparse_density = 20 +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +layer_height = 0.3 +material_bed_temperature_layer_0 = =material_bed_temperature +material_flow = 100 +material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +prime_tower_wall_thickness = =prime_tower_line_width * 2 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 0.5 +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) +skin_overlap = 5 +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 25 / 35) +speed_travel = 300 +speed_wall = =math.ceil(speed_print * 30 / 35) +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_angle = 60 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.6 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) +wall_thickness = 1.6 + From 5f6894c52341ea5339697e40e833abf17598077d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 11:14:21 +0200 Subject: [PATCH 066/379] Add PP profiles for UM2+ These new profiles are directly copied from what the material team provides. They should now be optimised. Contributes to issue CURA-3960. --- .../ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 93 ++++++++++++++++++ .../um2p_pp_0.4_normal.inst.cfg | 93 ++++++++++++++++++ .../um2p_pp_0.6_draft.inst.cfg | 95 +++++++++++++++++++ .../ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 95 +++++++++++++++++++ .../um2p_pp_0.8_draft.inst.cfg | 95 +++++++++++++++++++ .../ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg | 95 +++++++++++++++++++ 6 files changed, 566 insertions(+) create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg new file mode 100644 index 0000000000..2e5120b0d7 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -0,0 +1,93 @@ +[general] +version = 2 +name = Fast Quality +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_polypropylene_ultimaker2_plus_0.4_mm +weight = 0 +quality_type = fast + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +gradual_infill_step_height = =layer_height * 2 +gradual_infill_steps = 3 +infill_line_width = =round(line_width * 0.4 / 0.38, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_sparse_density = 96 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height = 0.15 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_amount = 8 +retraction_count_max = 12 +retraction_extra_prime_amount = 0 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +retraction_speed = 35 +skin_overlap = 10 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 0.8 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.38 / 0.38, 2) +wall_thickness = 0.76 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg new file mode 100644 index 0000000000..f311c28fc8 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -0,0 +1,93 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_polypropylene_ultimaker2_plus_0.4_mm +weight = 0 +quality_type = normal + +[values] +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +gradual_infill_step_height = =layer_height * 2 +gradual_infill_steps = 3 +infill_line_width = =round(line_width * 0.4 / 0.38, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_sparse_density = 96 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height = 0.1 +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_amount = 8 +retraction_count_max = 12 +retraction_extra_prime_amount = 0 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +retraction_speed = 35 +skin_overlap = 10 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 0.8 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.38 / 0.38, 2) +wall_thickness = 0.76 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg new file mode 100644 index 0000000000..341a35926a --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -0,0 +1,95 @@ +[general] +version = 2 +name = Draft Print +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_polypropylene_ultimaker2_plus_0.6_mm +weight = 0 +quality_type = draft + +[values] +layer_height = 0.2 +gradual_infill_steps = 3 +retraction_extra_prime_amount = 0 +skirt_brim_line_width = 0.6 +infill_overlap_mm = 0 +skin_overlap = 10 +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +gradual_infill_step_height = =layer_height * 2 +infill_line_width = =round(line_width * 0.6 / 0.57, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_sparse_density = 96 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_amount = 8 +retraction_count_max = 12 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +retraction_speed = 35 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.1 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.57 / 0.57, 2) +wall_thickness = 1.14 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg new file mode 100644 index 0000000000..d1790dde47 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -0,0 +1,95 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_polypropylene_ultimaker2_plus_0.6_mm +weight = -1 +quality_type = fast + +[values] +layer_height = 0.15 +gradual_infill_steps = 3 +retraction_extra_prime_amount = 0 +skirt_brim_line_width = 0.6 +infill_overlap_mm = 0 +skin_overlap = 10 +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +gradual_infill_step_height = =layer_height * 2 +infill_line_width = =round(line_width * 0.6 / 0.57, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_sparse_density = 96 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_amount = 8 +retraction_count_max = 12 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +retraction_speed = 35 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.1 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.57 / 0.57, 2) +wall_thickness = 1.14 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg new file mode 100644 index 0000000000..2a6397d2e8 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -0,0 +1,95 @@ +[general] +version = 2 +name = Draft Print +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_polypropylene_ultimaker2_plus_0.8_mm +weight = 0 +quality_type = draft + +[values] +layer_height = 0.3 +gradual_infill_steps = 3 +retraction_extra_prime_amount = 0 +skirt_brim_line_width = 0.8 +infill_overlap_mm = 0 +skin_overlap = 10 +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +gradual_infill_step_height = =layer_height * 2 +infill_line_width = =round(line_width * 0.8 / 0.76, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_sparse_density = 96 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_amount = 8 +retraction_count_max = 12 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +retraction_speed = 35 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.5 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.76 / 0.76, 2) +wall_thickness = 1.52 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg new file mode 100644 index 0000000000..185597ef74 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg @@ -0,0 +1,95 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_polypropylene_ultimaker2_plus_0.8_mm +weight = 0 +quality_type = fast + +[values] +layer_height = 0.2 +gradual_infill_steps = 3 +retraction_extra_prime_amount = 0 +skirt_brim_line_width = 0.8 +infill_overlap_mm = 0 +skin_overlap = 10 +acceleration_enabled = True +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_infill = =acceleration_support +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +acceleration_wall_x = =acceleration_wall +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 5 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +gradual_infill_step_height = =layer_height * 3 +infill_line_width = =round(line_width * 0.8 / 0.76, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_sparse_density = 96 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_infill = =jerk_support +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +jerk_wall_x = =jerk_wall +layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_amount = 8 +retraction_count_max = 12 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +retraction_speed = 35 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support = =speed_wall_0 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.5 +travel_avoid_distance = 3 +travel_compensate_overlapping_walls_enabled = True +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.76 / 0.76, 2) +wall_thickness = 1.52 \ No newline at end of file From e3dffd6610204fb40743f1cafefcfd1b3915fce3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 11:18:10 +0200 Subject: [PATCH 067/379] Plugin browser can now download & install plugins --- plugins/PluginBrowser/PluginBrowser.py | 29 +++++++++++++- plugins/PluginBrowser/PluginBrowser.qml | 51 ++++++++++++++++++------- 2 files changed, 64 insertions(+), 16 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 9fd75a92fc..a68ce75d8d 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -8,11 +8,12 @@ from UM.PluginRegistry import PluginRegistry from UM.Application import Application from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest -from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal +from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtQml import QQmlComponent, QQmlContext import json import os +import tempfile i18n_catalog = i18nCatalog("cura") @@ -25,6 +26,10 @@ class PluginBrowser(QObject, Extension): self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version self._plugin_list_request = None + self._download_plugin_request = None + + self._download_plugin_reply = None + self._network_manager = None self._plugins_metadata = [] @@ -63,6 +68,24 @@ class PluginBrowser(QObject, Extension): Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) + def _onDownloadPluginProgress(self, bytes_sent, bytes_total): + if bytes_total > 0: + new_progress = bytes_sent / bytes_total * 100 + + if new_progress == 100.0: + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") + self._temp_plugin_file.write(self._download_plugin_reply.readAll()) + result = PluginRegistry.getInstance().installPlugin("file://" + self._temp_plugin_file.name) + self._temp_plugin_file.close() # Plugin was installed, delete temp file + + @pyqtSlot(str) + def downloadAndInstallPlugin(self, url): + Logger.log("i", "Attempting to download & install plugin from %s", url) + url = QUrl(url) + self._download_plugin_request = QNetworkRequest(url) + self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) + self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) @pyqtProperty(QObject, notify=pluginsMetadataChanged) def pluginsModel(self): @@ -73,6 +96,7 @@ class PluginBrowser(QObject, Extension): self._plugins_model.addRoleName(Qt.UserRole + 3, "short_description") self._plugins_model.addRoleName(Qt.UserRole + 4, "author") self._plugins_model.addRoleName(Qt.UserRole + 5, "already_installed") + self._plugins_model.addRoleName(Qt.UserRole + 6, "file_location") else: self._plugins_model.clear() items = [] @@ -83,7 +107,8 @@ class PluginBrowser(QObject, Extension): "version": metadata["version"], "short_description": metadata["short_description"], "author": metadata["author"], - "already_installed": plugin_registry.getMetaData(metadata["id"]) != {} + "already_installed": plugin_registry.getMetaData(metadata["id"]) != {}, + "file_location": metadata["file_location"] }) self._plugins_model.setItems(items) return self._plugins_model diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 5f666a0148..0e2129d7ef 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -11,25 +11,48 @@ UM.Dialog title: "YAY" width: 450 height: 150 - ListView + ScrollView { - model: manager.pluginsModel anchors.fill: parent - delegate: Row + frameVisible: true + ListView { - width: parent.width - Button - { - text: model.name - } - Button - { - text: model.author - } + id: pluginList + model: manager.pluginsModel + anchors.fill: parent - Label + delegate: pluginDelegate + } + } + Item + { + SystemPalette { id: palette } + Component + { + id: pluginDelegate + Rectangle { - text: model.short_description + width: pluginList.width; + height: childrenRect.height; + color: index % 2 ? palette.base : palette.alternateBase + Row + { + width: parent.width + height: childrenRect.height; + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + Label + { + + text: model.name + width: contentWidth + } + Button + { + text: "Download" + onClicked: manager.downloadAndInstallPlugin(model.file_location) + } + } } } } From e6a3577e9d9f8cc13211f861ce67cf5f651f215d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 11:25:53 +0200 Subject: [PATCH 068/379] Plugin browser now also uses version to check if plugin is already installed CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index a68ce75d8d..cdee651e71 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -6,6 +6,7 @@ from UM.Logger import Logger from UM.Qt.ListModel import ListModel from UM.PluginRegistry import PluginRegistry from UM.Application import Application +from UM.Version import Version from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot @@ -100,19 +101,29 @@ class PluginBrowser(QObject, Extension): else: self._plugins_model.clear() items = [] - plugin_registry = PluginRegistry.getInstance() for metadata in self._plugins_metadata: items.append({ "name": metadata["label"], "version": metadata["version"], "short_description": metadata["short_description"], "author": metadata["author"], - "already_installed": plugin_registry.getMetaData(metadata["id"]) != {}, + "already_installed": self._checkAlreadyInstalled(metadata["id"], metadata["version"]), "file_location": metadata["file_location"] }) self._plugins_model.setItems(items) return self._plugins_model + def _checkAlreadyInstalled(self, id, version): + plugin_registry = PluginRegistry.getInstance() + metadata = plugin_registry.getMetaData(id) + if metadata != {}: + current_version = Version(metadata["plugin"]["version"]) + new_version = Version(version) + if new_version > current_version: + return False + return True + + def _onRequestFinished(self, reply): reply_url = reply.url().toString() if reply.operation() == QNetworkAccessManager.GetOperation: From d815c2afcf92ac22a0afde815c00936f74e8c0e6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 11:48:13 +0200 Subject: [PATCH 069/379] Added download progress bar to plugin browser CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 13 ++++++++++- plugins/PluginBrowser/PluginBrowser.qml | 30 ++++++++++++++++++------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index cdee651e71..251ed92d2f 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -39,8 +39,10 @@ class PluginBrowser(QObject, Extension): self._qml_component = None self._qml_context = None self._dialog = None + self._download_progress = 0 pluginsMetadataChanged = pyqtSignal() + onDownloadProgressChanged = pyqtSignal() def browsePlugins(self): self._createNetworkManager() @@ -72,7 +74,10 @@ class PluginBrowser(QObject, Extension): def _onDownloadPluginProgress(self, bytes_sent, bytes_total): if bytes_total > 0: new_progress = bytes_sent / bytes_total * 100 - + if new_progress > self._download_progress: + self._download_progress = new_progress + self.onDownloadProgressChanged.emit() + self._download_progress = new_progress if new_progress == 100.0: self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") @@ -80,12 +85,18 @@ class PluginBrowser(QObject, Extension): result = PluginRegistry.getInstance().installPlugin("file://" + self._temp_plugin_file.name) self._temp_plugin_file.close() # Plugin was installed, delete temp file + @pyqtProperty(int, notify = onDownloadProgressChanged) + def downloadProgress(self): + return self._download_progress + @pyqtSlot(str) def downloadAndInstallPlugin(self, url): Logger.log("i", "Attempting to download & install plugin from %s", url) url = QUrl(url) self._download_plugin_request = QNetworkRequest(url) self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) + self._download_progress = 0 + self.onDownloadProgressChanged.emit() self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) @pyqtProperty(QObject, notify=pluginsMetadataChanged) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 0e2129d7ef..477bf45ea0 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -13,7 +13,8 @@ UM.Dialog height: 150 ScrollView { - anchors.fill: parent + width: parent.width + height: parent.height - progressbar.height - UM.Theme.getSize("default_margin").height frameVisible: true ListView { @@ -24,6 +25,17 @@ UM.Dialog delegate: pluginDelegate } } + ProgressBar + { + id: progressbar + anchors.bottom: parent.bottom + style: UM.Theme.styles.progressbar + minimumValue: 0; + maximumValue: 100 + width: parent.width + height: 20 + value: manager.downloadProgress + } Item { SystemPalette { id: palette } @@ -37,23 +49,25 @@ UM.Dialog color: index % 2 ? palette.base : palette.alternateBase Row { - width: parent.width + width: childrenRect.width height: childrenRect.height; anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width Label { - text: model.name width: contentWidth } - Button - { - text: "Download" - onClicked: manager.downloadAndInstallPlugin(model.file_location) - } + + } + Button + { + text: "Download" + onClicked: manager.downloadAndInstallPlugin(model.file_location) + anchors.right: parent.right } } + } } } \ No newline at end of file From 051ce5e9f4998ccd7a2988e490026690e7e7e6c7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 11:51:00 +0200 Subject: [PATCH 070/379] Disabled download button on pluginbrowser for plugins that are already installed CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 477bf45ea0..849d2b4a8b 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -36,6 +36,7 @@ UM.Dialog height: 20 value: manager.downloadProgress } + Item { SystemPalette { id: palette } @@ -62,9 +63,10 @@ UM.Dialog } Button { - text: "Download" + text: enabled ? "Download" : "Already Installed" onClicked: manager.downloadAndInstallPlugin(model.file_location) anchors.right: parent.right + enabled: !model.already_installed } } From a4e353c830e0d2d6d014698c6b252ef2ef856dbb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 12:42:39 +0200 Subject: [PATCH 071/379] Download buttons are now disabled when another plugin is being downloaded CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 16 +++++++++++++++- plugins/PluginBrowser/PluginBrowser.qml | 6 +++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 251ed92d2f..eeaebdae4c 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -41,8 +41,16 @@ class PluginBrowser(QObject, Extension): self._dialog = None self._download_progress = 0 + self._is_downloading = False + + pluginsMetadataChanged = pyqtSignal() onDownloadProgressChanged = pyqtSignal() + onIsDownloadingChanged = pyqtSignal() + + @pyqtProperty(bool, notify = onIsDownloadingChanged) + def isDownloading(self): + return self._is_downloading def browsePlugins(self): self._createNetworkManager() @@ -71,6 +79,11 @@ class PluginBrowser(QObject, Extension): Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) + def setIsDownloading(self, is_downloading): + if self._is_downloading != is_downloading: + self._is_downloading = is_downloading + self.onIsDownloadingChanged.emit() + def _onDownloadPluginProgress(self, bytes_sent, bytes_total): if bytes_total > 0: new_progress = bytes_sent / bytes_total * 100 @@ -79,6 +92,7 @@ class PluginBrowser(QObject, Extension): self.onDownloadProgressChanged.emit() self._download_progress = new_progress if new_progress == 100.0: + self.setIsDownloading(False) self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") self._temp_plugin_file.write(self._download_plugin_reply.readAll()) @@ -96,6 +110,7 @@ class PluginBrowser(QObject, Extension): self._download_plugin_request = QNetworkRequest(url) self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) self._download_progress = 0 + self.setIsDownloading(True) self.onDownloadProgressChanged.emit() self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) @@ -134,7 +149,6 @@ class PluginBrowser(QObject, Extension): return False return True - def _onRequestFinished(self, reply): reply_url = reply.url().toString() if reply.operation() == QNetworkAccessManager.GetOperation: diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 849d2b4a8b..0258763a19 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -8,7 +8,7 @@ UM.Dialog { id: base - title: "YAY" + title: "Find & Update plugins" width: 450 height: 150 ScrollView @@ -63,10 +63,10 @@ UM.Dialog } Button { - text: enabled ? "Download" : "Already Installed" + text: !model.already_installed ? "Download" : "Already Installed" onClicked: manager.downloadAndInstallPlugin(model.file_location) anchors.right: parent.right - enabled: !model.already_installed + enabled: !model.already_installed && !manager.isDownloading } } From 71197e9101ed596be301a0f5ab32d13119d1fa04 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 12:45:40 +0200 Subject: [PATCH 072/379] Optimise new profiles This removes all settings that are equal to the defaults. Some settings are 'common' between all profiles of the same material. I've let those settings bubble up to the material profiles but that change is then obviously only apparent in the fdm_materials repository. Contributes to issue CURA-3960. --- .../um3_aa0.4_PP_Draft_Print.inst.cfg | 42 ----------- .../um3_aa0.4_PP_Fast_Print.inst.cfg | 42 ----------- .../um3_aa0.4_PP_Normal_Quality.inst.cfg | 43 ----------- .../um3_aa0.4_TPU_Draft_Print.inst.cfg | 6 +- .../um3_aa0.4_TPU_Fast_Print.inst.cfg | 4 +- .../um3_aa0.4_TPU_Normal_Quality.inst.cfg | 4 +- .../um3_aa0.8_CPEP_Draft_Print.inst.cfg | 64 +--------------- .../um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 64 +--------------- .../um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 62 +--------------- .../um3_aa0.8_PC_Draft_Print.inst.cfg | 73 +------------------ .../um3_aa0.8_PC_Superdraft_Print.inst.cfg | 73 +------------------ .../um3_aa0.8_PC_Verydraft_Print.inst.cfg | 72 +----------------- .../um3_aa0.8_PP_Draft_Print.inst.cfg | 13 +--- .../um3_aa0.8_PP_Superdraft_Print.inst.cfg | 13 +--- .../um3_aa0.8_PP_Verydraft_Print.inst.cfg | 13 +--- .../um3_aa0.8_TPU_Draft_Print.inst.cfg | 5 +- .../um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 5 +- .../um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 5 +- 18 files changed, 17 insertions(+), 586 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg index 3a559df3e8..8de84ae586 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -12,21 +12,8 @@ setting_version = 1 [values] acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 cool_min_layer_time = 7 cool_min_layer_time_fan_speed_max = 7 @@ -34,34 +21,19 @@ cool_min_speed = 2.5 infill_line_width = =round(line_width * 0.38 / 0.38, 2) infill_overlap = 0 infill_pattern = tetrahedral -infill_sparse_density = 20 infill_wipe_dist = 0.1 jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 5 / 25) -jerk_wall = =math.ceil(jerk_print * 10 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall layer_height = 0.2 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.95 machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 -material_bed_temperature = 85 material_bed_temperature_layer_0 = 90 material_final_print_temperature = 205 -material_flow = 100 material_initial_print_temperature = 210 material_print_temperature = 215 material_print_temperature_layer_0 = 220 -material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False prime_tower_size = 16 @@ -75,33 +47,19 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 18 -retraction_speed = 35 -skin_overlap = 15 speed_equalize_flow_enabled = True -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 300 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) -speed_wall_x = =speed_wall support_angle = 50 -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 1.2 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = =line_width * 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg index 23bbce605c..81e018a742 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -12,21 +12,8 @@ setting_version = 1 [values] acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 cool_min_layer_time = 7 cool_min_layer_time_fan_speed_max = 7 @@ -34,39 +21,23 @@ cool_min_speed = 2.5 infill_line_width = =round(line_width * 0.38 / 0.38, 2) infill_overlap = 0 infill_pattern = tetrahedral -infill_sparse_density = 20 infill_wipe_dist = 0.1 jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 5 / 25) -jerk_wall = =math.ceil(jerk_print * 10 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall layer_height = 0.15 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.95 machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 -material_bed_temperature = 85 material_bed_temperature_layer_0 = 90 material_final_print_temperature = 195 -material_flow = 100 material_initial_print_temperature = 205 material_print_temperature = 207 material_print_temperature_layer_0 = 210 -material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False prime_tower_size = 16 prime_tower_wipe_enabled = True -retraction_amount = 7 retraction_count_max = 12 retraction_extra_prime_amount = 0.8 retraction_extrusion_window = 1 @@ -75,33 +46,20 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 18 -retraction_speed = 35 -skin_overlap = 15 speed_equalize_flow_enabled = True -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 300 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) -speed_wall_x = =speed_wall support_angle = 50 -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 1.1 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = =line_width * 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg index e0e9fd3234..62cc558ff6 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -12,21 +12,8 @@ setting_version = 1 [values] acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 cool_min_layer_time = 7 cool_min_layer_time_fan_speed_max = 7 @@ -34,39 +21,22 @@ cool_min_speed = 2.5 infill_line_width = =round(line_width * 0.38 / 0.38, 2) infill_overlap = 0 infill_pattern = tetrahedral -infill_sparse_density = 20 infill_wipe_dist = 0.1 jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 5 / 25) -jerk_wall = =math.ceil(jerk_print * 10 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall -layer_height = 0.1 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.95 machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 -material_bed_temperature = 85 material_bed_temperature_layer_0 = 90 material_final_print_temperature = 195 -material_flow = 100 material_initial_print_temperature = 200 material_print_temperature = 205 material_print_temperature_layer_0 = 208 -material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False prime_tower_size = 16 prime_tower_wipe_enabled = True -retraction_amount = 7 retraction_count_max = 12 retraction_extra_prime_amount = 0.8 retraction_extrusion_window = 1 @@ -75,33 +45,20 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 18 -retraction_speed = 35 -skin_overlap = 15 speed_equalize_flow_enabled = True -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 300 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) -speed_wall_x = =speed_wall support_angle = 50 -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 1 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = =line_width * 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index 8c6318a698..59600a00ae 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -36,9 +36,7 @@ material_flow = 106 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0 -prime_tower_enable = True prime_tower_wipe_enabled = True retraction_count_max = 12 retraction_extra_prime_amount = 0.8 @@ -48,6 +46,7 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.8 retraction_prime_speed = 15 +skin_overlap = 5 speed_equalize_flow_enabled = True speed_layer_0 = 18 speed_print = 25 @@ -56,7 +55,6 @@ speed_travel = 300 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 -skin_overlap = 5 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 @@ -64,4 +62,4 @@ top_bottom_thickness = 0.7 travel_avoid_distance = 1.5 wall_0_inset = 0 wall_line_width_x = =line_width -wall_thickness = 0.76 +wall_thickness = 0.76 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index 129135f6a1..3cae3e53c9 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -36,9 +36,7 @@ material_flow = 106 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0 -prime_tower_enable = True prime_tower_wipe_enabled = True retraction_amount = 7 retraction_count_max = 12 @@ -65,4 +63,4 @@ top_bottom_thickness = 0.7 travel_avoid_distance = 1.5 wall_0_inset = 0 wall_line_width_x = =line_width -wall_thickness = 0.76 +wall_thickness = 0.76 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index eb71f1ef3f..96146c5b68 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -34,9 +34,7 @@ material_final_print_temperature = =material_print_temperature - 21 material_flow = 106 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature_layer_0 = =default_material_print_temperature -material_standby_temperature = 100 multiple_mesh_overlap = 0 -prime_tower_enable = True prime_tower_wipe_enabled = True retraction_count_max = 12 retraction_extra_prime_amount = 0.8 @@ -62,4 +60,4 @@ top_bottom_thickness = 0.7 travel_avoid_distance = 1.5 wall_0_inset = 0 wall_line_width_x = =line_width -wall_thickness = 0.76 +wall_thickness = 0.76 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg index a40339e9c9..31a900dfb6 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg @@ -11,88 +11,26 @@ weight = -2 setting_version = 1 [values] -acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 14 cool_fan_full_at_height = =layer_height_0 + 14 * layer_height -cool_fan_speed = 8 -cool_fan_speed_max = 100 -cool_min_layer_time = 5 -cool_min_speed = 5 infill_before_walls = True -infill_line_width = =round(line_width * 0.6 / 0.7, 2) -infill_overlap = 0 -infill_pattern = triangles -infill_sparse_density = 20 -infill_wipe_dist = 0 -jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 25 / 25) -jerk_wall = =math.ceil(jerk_print * 25 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) -jerk_wall_x = =jerk_wall -layer_height = 0.2 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.9375 -machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 -material_bed_temperature = 107 material_print_temperature = =default_material_print_temperature - 10 material_print_temperature_layer_0 = =material_print_temperature -material_initial_print_temperature = =material_print_temperature - 5 -material_final_print_temperature = =material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -prime_tower_enable = False -prime_tower_wipe_enabled = True -retraction_amount = 6.5 retraction_combing = off -retraction_count_max = 25 -retraction_extrusion_window = 1 retraction_hop = 0.1 retraction_hop_enabled = False -retraction_hop_only_when_collides = True skin_overlap = 0 -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 50 speed_slowdown_layers = 15 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 35 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 35 / 40) -speed_wall_x = =speed_wall -support_angle = 60 support_bottom_distance = =support_z_distance support_line_width = =round(line_width * 0.6 / 0.7, 2) -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 support_z_distance = =layer_height -switch_extruder_retraction_amount = 16.5 top_bottom_thickness = 1.2 -travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_enabled = True -wall_0_inset = 0 -wall_line_width_x = =wall_line_width -wall_thickness = 2 +travel_avoid_distance = 1.5 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index 8b1fbabea8..ca43a195aa 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -11,88 +11,28 @@ weight = -2 setting_version = 1 [values] -acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 14 cool_fan_full_at_height = =layer_height_0 + 7 * layer_height -cool_fan_speed = 8 -cool_fan_speed_max = 100 -cool_min_layer_time = 5 -cool_min_speed = 5 infill_before_walls = True -infill_line_width = =round(line_width * 0.6 / 0.7, 2) -infill_overlap = 0 -infill_pattern = triangles -infill_sparse_density = 20 -infill_wipe_dist = 0 -jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 25 / 25) -jerk_wall = =math.ceil(jerk_print * 25 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) -jerk_wall_x = =jerk_wall layer_height = 0.4 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.9375 -machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 -material_bed_temperature = 107 -material_print_temperature = =default_material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature - 5 material_print_temperature_layer_0 = =material_print_temperature -material_initial_print_temperature = =material_print_temperature - 5 -material_final_print_temperature = =material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 prime_tower_enable = True -prime_tower_wipe_enabled = True -retraction_amount = 6.5 retraction_combing = off -retraction_count_max = 25 -retraction_extrusion_window = 1 retraction_hop = 0.1 retraction_hop_enabled = False -retraction_hop_only_when_collides = True skin_overlap = 0 -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 50 speed_slowdown_layers = 8 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 35 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 35 / 40) -speed_wall_x = =speed_wall -support_angle = 60 support_bottom_distance = =support_z_distance support_line_width = =round(line_width * 0.6 / 0.7, 2) -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 support_z_distance = =layer_height -switch_extruder_retraction_amount = 16.5 top_bottom_thickness = 1.2 -travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_enabled = True -wall_0_inset = 0 -wall_line_width_x = =wall_line_width -wall_thickness = 2 +travel_avoid_distance = 1.5 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index a478ea8b8a..f38bef84c1 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -11,88 +11,28 @@ weight = -1 setting_version = 1 [values] -acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 14 cool_fan_full_at_height = =layer_height_0 + 9 * layer_height -cool_fan_speed = 8 -cool_fan_speed_max = 100 -cool_min_layer_time = 5 -cool_min_speed = 5 infill_before_walls = True -infill_line_width = =round(line_width * 0.6 / 0.7, 2) -infill_overlap = 0 -infill_pattern = triangles -infill_sparse_density = 20 -infill_wipe_dist = 0 -jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 25 / 25) -jerk_wall = =math.ceil(jerk_print * 25 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) -jerk_wall_x = =jerk_wall layer_height = 0.3 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.9375 -machine_min_cool_heat_time_window = 15 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 -material_bed_temperature = 107 material_print_temperature = =default_material_print_temperature - 7 material_print_temperature_layer_0 = =material_print_temperature -material_initial_print_temperature = =material_print_temperature - 5 -material_final_print_temperature = =material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 prime_tower_enable = True -prime_tower_wipe_enabled = True -retraction_amount = 6.5 retraction_combing = off -retraction_count_max = 25 -retraction_extrusion_window = 1 retraction_hop = 0.1 retraction_hop_enabled = False -retraction_hop_only_when_collides = True skin_overlap = 0 -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 50 speed_slowdown_layers = 10 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 35 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 35 / 40) -speed_wall_x = =speed_wall -support_angle = 60 support_bottom_distance = =support_z_distance support_line_width = =round(line_width * 0.6 / 0.7, 2) -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 support_z_distance = =layer_height -switch_extruder_retraction_amount = 16.5 top_bottom_thickness = 1.2 -travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_enabled = True -wall_0_inset = 0 -wall_line_width_x = =wall_line_width -wall_thickness = 2 +travel_avoid_distance = 1.5 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg index c03e7bc385..b262aeef34 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg @@ -11,91 +11,20 @@ weight = 0 setting_version = 1 [values] -acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 14 cool_fan_full_at_height = =layer_height_0 + 14 * layer_height -cool_fan_speed = 5 -cool_fan_speed_max = 100 -cool_min_layer_time = 5 -cool_min_speed = 5 infill_before_walls = True -infill_line_width = =round(line_width * 0.6 / 0.7, 2) -infill_overlap = 0 -infill_pattern = triangles -infill_sparse_density = 20 -infill_wipe_dist = 0 -jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 25 / 25) -jerk_wall = =math.ceil(jerk_print * 25 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) -jerk_wall_x = =jerk_wall -layer_height = 0.2 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.875 -machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_bed_temperature = 107 material_print_temperature = =default_material_print_temperature - 5 material_print_temperature_layer_0 = =material_print_temperature -material_initial_print_temperature = =material_print_temperature - 5 -material_final_print_temperature = =material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -prime_tower_enable = False -prime_tower_wipe_enabled = True raft_airgap = 0.5 raft_margin = 15 -retract_at_layer_change = True -retraction_amount = 6.5 -retraction_count_max = 25 -retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True skin_overlap = 0 -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 50 speed_slowdown_layers = 15 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) -speed_wall_x = =speed_wall -support_angle = 60 -support_bottom_distance = =support_z_distance / 2 support_line_width = =round(line_width * 0.6 / 0.7, 2) -support_pattern = zigzag -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 -switch_extruder_retraction_amount = 16.5 -top_bottom_thickness = 1.4 -travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True -wall_0_inset = 0 -wall_line_width_x = =wall_line_width -wall_thickness = 2 +travel_avoid_distance = 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg index eed4fbf3a6..0285d492da 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -11,91 +11,20 @@ weight = -2 setting_version = 1 [values] -acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 14 cool_fan_full_at_height = =layer_height_0 + 7 * layer_height -cool_fan_speed = 5 -cool_fan_speed_max = 100 -cool_min_layer_time = 5 -cool_min_speed = 5 infill_before_walls = True -infill_line_width = =round(line_width * 0.6 / 0.7, 2) -infill_overlap = 0 -infill_pattern = triangles -infill_sparse_density = 20 -infill_wipe_dist = 0 -jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 25 / 25) -jerk_wall = =math.ceil(jerk_print * 25 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) -jerk_wall_x = =jerk_wall layer_height = 0.4 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.875 -machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_bed_temperature = 107 -material_print_temperature = =default_material_print_temperature material_print_temperature_layer_0 = =material_print_temperature -material_initial_print_temperature = =material_print_temperature - 5 -material_final_print_temperature = =material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -prime_tower_enable = False -prime_tower_wipe_enabled = True raft_airgap = 0.5 raft_margin = 15 -retract_at_layer_change = True -retraction_amount = 6.5 -retraction_count_max = 25 -retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True skin_overlap = 0 -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 50 speed_slowdown_layers = 8 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) -speed_wall_x = =speed_wall -support_angle = 60 -support_bottom_distance = =support_z_distance / 2 support_line_width = =round(line_width * 0.6 / 0.7, 2) -support_pattern = zigzag -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 -switch_extruder_retraction_amount = 16.5 -top_bottom_thickness = 1.4 -travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True -wall_0_inset = 0 -wall_line_width_x = =wall_line_width -wall_thickness = 2 +travel_avoid_distance = 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg index c1a15d3ddc..96609d7bda 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -11,91 +11,21 @@ weight = -1 setting_version = 1 [values] -acceleration_enabled = True -acceleration_infill = =acceleration_print -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 14 cool_fan_full_at_height = =layer_height_0 + 9 * layer_height -cool_fan_speed = 5 -cool_fan_speed_max = 100 -cool_min_layer_time = 5 -cool_min_speed = 5 infill_before_walls = True -infill_line_width = =round(line_width * 0.6 / 0.7, 2) -infill_overlap = 0 -infill_pattern = triangles -infill_sparse_density = 20 -infill_wipe_dist = 0 -jerk_enabled = True -jerk_infill = =jerk_print -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 25 / 25) -jerk_wall = =math.ceil(jerk_print * 25 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) -jerk_wall_x = =jerk_wall layer_height = 0.3 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.875 -machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_bed_temperature = 107 material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =material_print_temperature -material_initial_print_temperature = =material_print_temperature - 5 -material_final_print_temperature = =material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -prime_tower_enable = False -prime_tower_wipe_enabled = True raft_airgap = 0.5 raft_margin = 15 -retract_at_layer_change = True -retraction_amount = 6.5 -retraction_count_max = 25 -retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True skin_overlap = 0 -speed_infill = =speed_print speed_layer_0 = 15 -speed_prime_tower = =speed_topbottom speed_print = 50 speed_slowdown_layers = 10 -speed_support = =speed_wall_0 -speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) -speed_wall_x = =speed_wall -support_angle = 60 -support_bottom_distance = =support_z_distance / 2 support_line_width = =round(line_width * 0.6 / 0.7, 2) -support_pattern = zigzag -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 -switch_extruder_retraction_amount = 16.5 -top_bottom_thickness = 1.4 -travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True -wall_0_inset = 0 -wall_line_width_x = =wall_line_width -wall_thickness = 2 +travel_avoid_distance = 3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index 5c86daff89..a9ad0a58bd 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -12,7 +12,6 @@ setting_version = 1 [values] brim_width = 25 -cool_fan_speed = 10 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 17 expand_skins_expand_distance = =line_width * 2 @@ -21,15 +20,12 @@ expand_upper_skins = True infill_before_walls = True infill_line_width = =round(line_width * 0.7 / 0.8, 2) infill_pattern = tetrahedral -infill_sparse_density = 20 jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) jerk_support = =math.ceil(jerk_print * 25 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) material_bed_temperature_layer_0 = =material_bed_temperature -material_flow = 100 material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 @@ -38,17 +34,11 @@ retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_hop_only_when_collides = True retraction_min_travel = 1.5 retraction_prime_speed = 15 skin_line_width = =round(line_width * 0.78 / 0.8, 2) -skin_overlap = 5 -speed_print = 35 -speed_topbottom = =math.ceil(speed_print * 25 / 35) speed_travel = 300 -speed_wall = =math.ceil(speed_print * 30 / 35) speed_wall_x = =math.ceil(speed_wall * 30 / 30) -support_angle = 60 support_bottom_distance = =support_z_distance support_line_width = =round(line_width * 0.7 / 0.8, 2) support_offset = =line_width @@ -59,5 +49,4 @@ top_bottom_thickness = 1.6 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) -wall_thickness = 1.6 - +wall_thickness = 1.6 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index 7dd422b300..74ab389d56 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -12,7 +12,6 @@ setting_version = 1 [values] brim_width = 25 -cool_fan_speed = 10 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 17 expand_skins_expand_distance = =line_width * 2 @@ -21,15 +20,12 @@ expand_upper_skins = True infill_before_walls = True infill_line_width = =round(line_width * 0.7 / 0.8, 2) infill_pattern = tetrahedral -infill_sparse_density = 20 jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) jerk_support = =math.ceil(jerk_print * 25 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) material_bed_temperature_layer_0 = =material_bed_temperature -material_flow = 100 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 @@ -38,17 +34,11 @@ retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_hop_only_when_collides = True retraction_min_travel = 1.5 retraction_prime_speed = 15 skin_line_width = =round(line_width * 0.78 / 0.8, 2) -skin_overlap = 5 -speed_print = 35 -speed_topbottom = =math.ceil(speed_print * 25 / 35) speed_travel = 300 -speed_wall = =math.ceil(speed_print * 30 / 35) speed_wall_x = =math.ceil(speed_wall * 30 / 30) -support_angle = 60 support_bottom_distance = =support_z_distance support_line_width = =round(line_width * 0.7 / 0.8, 2) support_offset = =line_width @@ -59,5 +49,4 @@ top_bottom_thickness = 1.6 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) -wall_thickness = 1.6 - +wall_thickness = 1.6 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index 00958e7381..f51e116cac 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -12,7 +12,6 @@ setting_version = 1 [values] brim_width = 25 -cool_fan_speed = 10 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 17 expand_skins_expand_distance = =line_width * 2 @@ -21,15 +20,12 @@ expand_upper_skins = True infill_before_walls = True infill_line_width = =round(line_width * 0.7 / 0.8, 2) infill_pattern = tetrahedral -infill_sparse_density = 20 jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) jerk_support = =math.ceil(jerk_print * 25 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) layer_height = 0.3 material_bed_temperature_layer_0 = =material_bed_temperature -material_flow = 100 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 @@ -38,17 +34,11 @@ retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_hop_only_when_collides = True retraction_min_travel = 1.5 retraction_prime_speed = 15 skin_line_width = =round(line_width * 0.78 / 0.8, 2) -skin_overlap = 5 -speed_print = 35 -speed_topbottom = =math.ceil(speed_print * 25 / 35) speed_travel = 300 -speed_wall = =math.ceil(speed_print * 30 / 35) speed_wall_x = =math.ceil(speed_wall * 30 / 30) -support_angle = 60 support_bottom_distance = =support_z_distance support_line_width = =round(line_width * 0.7 / 0.8, 2) support_offset = =line_width @@ -59,5 +49,4 @@ top_bottom_thickness = 1.6 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) -wall_thickness = 1.6 - +wall_thickness = 1.6 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 33f1b7952a..4f5a8f99dd 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -33,7 +33,6 @@ material_flow = 105 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 @@ -42,7 +41,6 @@ retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 retraction_hop = 1.5 -retraction_hop_enabled = True retraction_hop_only_when_collides = False retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -64,5 +62,4 @@ travel_avoid_distance = 1.5 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) -wall_thickness = 1.3 - +wall_thickness = 1.3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index 42a819ec82..c91bf4c107 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -34,7 +34,6 @@ material_flow = 105 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 @@ -43,7 +42,6 @@ retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 retraction_hop = 1.5 -retraction_hop_enabled = True retraction_hop_only_when_collides = False retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -65,5 +63,4 @@ travel_avoid_distance = 1.5 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) -wall_thickness = 1.3 - +wall_thickness = 1.3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index dd3cc8fa68..78094b33b4 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -33,7 +33,6 @@ material_final_print_temperature = =material_print_temperature - 21 material_flow = 105 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature_layer_0 = =default_material_print_temperature + 2 -material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 @@ -42,7 +41,6 @@ retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 retraction_hop = 1.5 -retraction_hop_enabled = True retraction_hop_only_when_collides = False retraction_min_travel = 0.8 retraction_prime_speed = 15 @@ -64,5 +62,4 @@ travel_avoid_distance = 1.5 travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) -wall_thickness = 1.3 - +wall_thickness = 1.3 \ No newline at end of file From b2a21f04434b4dd56423d5f73af8e2018ad40a1c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 12:49:36 +0200 Subject: [PATCH 073/379] Uninstalled plugins are now correctly marked as such again CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 2 ++ plugins/PluginBrowser/PluginBrowser.qml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index eeaebdae4c..ac00316313 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -147,6 +147,8 @@ class PluginBrowser(QObject, Extension): new_version = Version(version) if new_version > current_version: return False + else: + return False return True def _onRequestFinished(self, reply): diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 0258763a19..bac4f076db 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -10,7 +10,7 @@ UM.Dialog title: "Find & Update plugins" width: 450 - height: 150 + height: 450 ScrollView { width: parent.width From fa394a0171eaab429c2c84cf0511849458f7937b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 12:58:33 +0200 Subject: [PATCH 074/379] Remove Not-Supported profiles for CPE+ and PC They are now supported. This breaks the stacks of people who had these profiles active when they upgraded from 2.6.0 to 2.6.1, which causes them to get a screen of which printer they want to add, and they lose their current settings. But we decided that this use case is too slim to make an entire version upgrade for this patch-version release. Contributes to issue CURA-3960. --- .../um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg | 14 -------------- ..._CPEP_Not_Supported_Superdraft_Quality.inst.cfg | 14 -------------- .../um3_aa0.8_PC_Not_Supported_Quality.inst.cfg | 14 -------------- ....8_PC_Not_Supported_Superdraft_Quality.inst.cfg | 14 -------------- 4 files changed, 56 deletions(-) delete mode 100755 resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg delete mode 100755 resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg delete mode 100755 resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg delete mode 100755 resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg deleted file mode 100755 index ddde16205e..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_plus_ultimaker3_AA_0.8 -weight = 0 -supported = False -setting_version = 1 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg deleted file mode 100755 index 8d65a8a653..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_cpe_plus_ultimaker3_AA_0.8 -weight = 0 -supported = False -setting_version = 1 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg deleted file mode 100755 index a047bc4496..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = normal -material = generic_pc_ultimaker3_AA_0.8 -supported = False -setting_version = 1 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg deleted file mode 100755 index a73c5a121a..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = superdraft -material = generic_pc_ultimaker3_AA_0.8 -supported = False -setting_version = 1 - -[values] From 68b4d8d4992d4fb4559bcbb051c8a7915cc1940b Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 23 Jun 2017 13:01:38 +0200 Subject: [PATCH 075/379] Remove beta from changelog --- plugins/ChangeLogPlugin/ChangeLog.txt | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index d647ec6dbd..36ac5d3424 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,6 +1,6 @@ [2.6.0] *Cura versions -Cura 2.6 beta has local version folders, which means the new version won’t overwrite the existing configuration and profiles from older versions, but can create a new folder instead. You can now safely check out new beta versions and, if necessary, start up an older version without the danger of losing your profiles. +Cura 2.6 has local version folders, which means the new version won’t overwrite the existing configuration and profiles from older versions, but can create a new folder instead. You can now safely check out new beta versions and, if necessary, start up an older version without the danger of losing your profiles. *Better support adhesion We’ve added extra support settings to allow the creation of improved support profiles with better PVA/PLA adhesion. The Support Interface settings, such as speed and density, are now split up into Support Roof and Support Floor settings. @@ -9,7 +9,7 @@ We’ve added extra support settings to allow the creation of improved support p Custom third-party printers and Ultimaker modifications now have multi-extrusion support. Thanks to Aldo Hoeben for this feature. *Model auto-arrange -We’ve improved placing multiple models or multiplying the same ones, making it easier to arrange your build plate. If there’s not enough build plate space or the model is placed beyond the build plate, you can rectify this by selecting ‘Arrange all models’ in the context menu or by pressing Command+R (MacOS) or Ctrl+R (Windows and Linux). Cura 2.6 beta will then find a better solution for model positioning. +We’ve improved placing multiple models or multiplying the same ones, making it easier to arrange your build plate. If there’s not enough build plate space or the model is placed beyond the build plate, you can rectify this by selecting ‘Arrange all models’ in the context menu or by pressing Command+R (MacOS) or Ctrl+R (Windows and Linux). Cura 2.6 will then find a better solution for model positioning. *Gradual infill You can now find the Gradual Infill button in Recommended mode. This setting makes the infill concentrated near the top of the model – so that we can save time and material for the lower parts of the model. This functionality is especially useful when printing with flexible materials. @@ -42,27 +42,16 @@ It’s a lot simpler to save and open files, and Cura will know if it’s a proj If you have a custom theme, you can now apply it more easily in the preferences screen. *Time estimates per feature -<<<<<<< HEAD -You can hover over the print time estimate in the lower right corner to see how the printing time is divided over the printing features (walls, infill, etc.). -======= You can hover over the print time estimate in the lower right corner to see how the printing time is divided over the printing features (walls, infill, etc.). Thanks to 14bitVoid for this feature. ->>>>>>> 2.6 *Invert the direction of camera zoom We’ve added an option to invert mouse direction for a better user experience. *Olsson block upgrade -<<<<<<< HEAD -Ultimaker 2 users can now specify if they have the Olsson block installed on their machine. - -*OctoPrint plugin -Cura 2.6 beta allows users to send prints to OctoPrint. -======= Ultimaker 2 users can now specify if they have the Olsson block installed on their machine. Thanks to Aldo Hoeben for this feature. *OctoPrint plugin -Cura 2.6 beta allows users to send prints to OctoPrint. Thanks to Aldo Hoeben for this feature. ->>>>>>> 2.6 +Cura 2.6 allows users to send prints to OctoPrint. Thanks to Aldo Hoeben for this feature. *Bug fixes - Post Processing plugin From 68663b27896cbec0c5a6e32296a3e1888a1486df Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 13:03:30 +0200 Subject: [PATCH 076/379] Plugin browser now shows difference between new & upgradable plugins CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 17 +++++++++++++---- plugins/PluginBrowser/PluginBrowser.qml | 5 ++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index ac00316313..4a9041d835 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -124,6 +124,7 @@ class PluginBrowser(QObject, Extension): self._plugins_model.addRoleName(Qt.UserRole + 4, "author") self._plugins_model.addRoleName(Qt.UserRole + 5, "already_installed") self._plugins_model.addRoleName(Qt.UserRole + 6, "file_location") + self._plugins_model.addRoleName(Qt.UserRole + 7, "can_upgrade") else: self._plugins_model.clear() items = [] @@ -134,22 +135,30 @@ class PluginBrowser(QObject, Extension): "short_description": metadata["short_description"], "author": metadata["author"], "already_installed": self._checkAlreadyInstalled(metadata["id"], metadata["version"]), - "file_location": metadata["file_location"] + "file_location": metadata["file_location"], + "can_upgrade": self._checkCanUpgrade(metadata["id"], metadata["version"]) }) + print(items) self._plugins_model.setItems(items) return self._plugins_model - def _checkAlreadyInstalled(self, id, version): + def _checkCanUpgrade(self, id, version): plugin_registry = PluginRegistry.getInstance() metadata = plugin_registry.getMetaData(id) if metadata != {}: current_version = Version(metadata["plugin"]["version"]) new_version = Version(version) if new_version > current_version: - return False + return True + return False + + def _checkAlreadyInstalled(self, id, version): + plugin_registry = PluginRegistry.getInstance() + metadata = plugin_registry.getMetaData(id) + if metadata != {}: + return True else: return False - return True def _onRequestFinished(self, reply): reply_url = reply.url().toString() diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index bac4f076db..10f20b7343 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -59,14 +59,13 @@ UM.Dialog text: model.name width: contentWidth } - } Button { - text: !model.already_installed ? "Download" : "Already Installed" + text: !model.already_installed ? "Download" : model.can_upgrade ? "Upgrade" : "Download" onClicked: manager.downloadAndInstallPlugin(model.file_location) anchors.right: parent.right - enabled: !model.already_installed && !manager.isDownloading + enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading } } From 4c8015f17f2b285d330fa6b30781501ebbc9e8d2 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 23 Jun 2017 13:01:38 +0200 Subject: [PATCH 077/379] Remove beta from changelog --- plugins/ChangeLogPlugin/ChangeLog.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 869dc69f82..36ac5d3424 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,6 +1,6 @@ [2.6.0] *Cura versions -Cura 2.6 beta has local version folders, which means the new version won’t overwrite the existing configuration and profiles from older versions, but can create a new folder instead. You can now safely check out new beta versions and, if necessary, start up an older version without the danger of losing your profiles. +Cura 2.6 has local version folders, which means the new version won’t overwrite the existing configuration and profiles from older versions, but can create a new folder instead. You can now safely check out new beta versions and, if necessary, start up an older version without the danger of losing your profiles. *Better support adhesion We’ve added extra support settings to allow the creation of improved support profiles with better PVA/PLA adhesion. The Support Interface settings, such as speed and density, are now split up into Support Roof and Support Floor settings. @@ -9,7 +9,7 @@ We’ve added extra support settings to allow the creation of improved support p Custom third-party printers and Ultimaker modifications now have multi-extrusion support. Thanks to Aldo Hoeben for this feature. *Model auto-arrange -We’ve improved placing multiple models or multiplying the same ones, making it easier to arrange your build plate. If there’s not enough build plate space or the model is placed beyond the build plate, you can rectify this by selecting ‘Arrange all models’ in the context menu or by pressing Command+R (MacOS) or Ctrl+R (Windows and Linux). Cura 2.6 beta will then find a better solution for model positioning. +We’ve improved placing multiple models or multiplying the same ones, making it easier to arrange your build plate. If there’s not enough build plate space or the model is placed beyond the build plate, you can rectify this by selecting ‘Arrange all models’ in the context menu or by pressing Command+R (MacOS) or Ctrl+R (Windows and Linux). Cura 2.6 will then find a better solution for model positioning. *Gradual infill You can now find the Gradual Infill button in Recommended mode. This setting makes the infill concentrated near the top of the model – so that we can save time and material for the lower parts of the model. This functionality is especially useful when printing with flexible materials. @@ -51,7 +51,7 @@ We’ve added an option to invert mouse direction for a better user experience. Ultimaker 2 users can now specify if they have the Olsson block installed on their machine. Thanks to Aldo Hoeben for this feature. *OctoPrint plugin -Cura 2.6 beta allows users to send prints to OctoPrint. Thanks to Aldo Hoeben for this feature. +Cura 2.6 allows users to send prints to OctoPrint. Thanks to Aldo Hoeben for this feature. *Bug fixes - Post Processing plugin From 4b6f9be4ed21547835114627fc35824c6a6bde43 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 13:05:58 +0200 Subject: [PATCH 078/379] Correct names The old names are what the materials team uses internally, and sorta old names too. Contributes to issue CURA-3960. --- .../quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg index 31a900dfb6..b58210badf 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Normal Print 0.8 +name = Fast definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index ca43a195aa..f29b630f48 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Draft Print 0.8 +name = Sprint definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index f38bef84c1..589892f11b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fasr Print 0.8 +name = Extra Fast definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg index b262aeef34..5617be141d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Normal 0.8 Print +name = Fast definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg index 0285d492da..3f6dadbb73 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Draft 0.8 Print +name = Sprint definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg index 96609d7bda..ff5d6a0a5f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast 0.8 Print +name = Extra Fast definition = ultimaker3 [metadata] From f3a9267fa680752efa4b49ef26f2e778645ef087 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 23 Jun 2017 13:32:18 +0200 Subject: [PATCH 079/379] Revert "Make LayerView work with "Purge" line type" CURA-3094 --- cura/LayerPolygon.py | 13 ++++--------- plugins/LayerView/LayerPass.py | 2 -- plugins/LayerView/LayerView.py | 11 ----------- plugins/LayerView/LayerView.qml | 8 -------- plugins/LayerView/layers.shader | 13 ------------- plugins/LayerView/layers3d.shader | 5 ----- resources/themes/cura/theme.json | 5 ++--- 7 files changed, 6 insertions(+), 51 deletions(-) diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 59c900a263..d6ab854169 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -18,14 +18,10 @@ class LayerPolygon: MoveCombingType = 8 MoveRetractionType = 9 SupportInterfaceType = 10 - PurgeType = 11 - - __number_of_types = 12 - - __jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType, - numpy.arange(__number_of_types) == MoveCombingType), - numpy.arange(__number_of_types) == MoveRetractionType) + __number_of_types = 11 + __jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType, numpy.arange(__number_of_types) == MoveCombingType), numpy.arange(__number_of_types) == MoveRetractionType) + ## LayerPolygon, used in ProcessSlicedLayersJob # \param extruder # \param line_types array with line_types @@ -226,8 +222,7 @@ class LayerPolygon: theme.getColor("layerview_support_infill").getRgbF(), # SupportInfillType theme.getColor("layerview_move_combing").getRgbF(), # MoveCombingType theme.getColor("layerview_move_retraction").getRgbF(), # MoveRetractionType - theme.getColor("layerview_support_interface").getRgbF(), # SupportInterfaceType - theme.getColor("layerview_purge").getRgbF() # PurgeType + theme.getColor("layerview_support_interface").getRgbF() # SupportInterfaceType ]) return cls.__color_map diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 269e28d473..51a35fb48a 100755 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -51,7 +51,6 @@ class LayerPass(RenderPass): self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) - self._layer_shader.setUniformValue("u_show_purge", self._layer_view.getShowPurge()) else: #defaults self._layer_shader.setUniformValue("u_layer_view_type", 1) @@ -60,7 +59,6 @@ class LayerPass(RenderPass): self._layer_shader.setUniformValue("u_show_helpers", 1) self._layer_shader.setUniformValue("u_show_skin", 1) self._layer_shader.setUniformValue("u_show_infill", 1) - self._layer_shader.setUniformValue("u_show_purge", 1) if not self._tool_handle_shader: self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 4230c0f9e0..97a343bd33 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -82,7 +82,6 @@ class LayerView(View): Preferences.getInstance().addPreference("layerview/show_helpers", True) Preferences.getInstance().addPreference("layerview/show_skin", True) Preferences.getInstance().addPreference("layerview/show_infill", True) - Preferences.getInstance().addPreference("layerview/show_purge", True) Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) self._updateWithPreferences() @@ -101,7 +100,6 @@ class LayerView(View): self._show_helpers = 1 self._show_skin = 1 self._show_infill = 1 - self._show_purge = 1 def getActivity(self): return self._activity @@ -239,13 +237,6 @@ class LayerView(View): def getShowInfill(self): return self._show_infill - def setShowPurge(self, show): - self._show_purge = show - self.currentLayerNumChanged.emit() - - def getShowPurge(self): - return self._show_purge - def getCompatibilityMode(self): return self._compatibility_mode @@ -417,7 +408,6 @@ class LayerView(View): self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) - self.setShowPurge(bool(Preferences.getInstance().getValue("layerview/show_purge"))) self._startUpdateTopLayers() self.preferencesChanged.emit() @@ -433,7 +423,6 @@ class LayerView(View): "layerview/show_helpers", "layerview/show_skin", "layerview/show_infill", - "layerview/show_purge", }: return diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 1757d72ac7..9dc038fe70 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -43,7 +43,6 @@ Item property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") - property bool show_purge: UM.Preferences.getValue("layerview/show_purge") // if we are in compatibility mode, we only show the "line type" property bool show_legend: UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type") == 1 property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") @@ -158,7 +157,6 @@ Item view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - view_settings.show_purge = UM.Preferences.getValue("layerview/show_purge"); view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); } @@ -221,12 +219,6 @@ Item preference: "layerview/show_infill", colorId: "layerview_infill" }); - typesLegenModel.append({ - label: catalog.i18nc("@label", "Show Purge"), - initialValue: view_settings.show_purge, - preference: "layerview/show_purge", - colorId: "layerview_purge" - }); } } diff --git a/plugins/LayerView/layers.shader b/plugins/LayerView/layers.shader index 2f7a01cf11..d340773403 100755 --- a/plugins/LayerView/layers.shader +++ b/plugins/LayerView/layers.shader @@ -35,7 +35,6 @@ fragment = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; - uniform int u_show_purge; void main() { @@ -63,11 +62,6 @@ fragment = // discard movements discard; } - // purge: - if ((u_show_purge == 0) && (v_line_type >= 10.5) && (v_line_type <= 11.5)) { - // discard movements - discard; - } gl_FragColor = v_color; } @@ -109,7 +103,6 @@ fragment41core = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; - uniform int u_show_purge; void main() { @@ -137,11 +130,6 @@ fragment41core = // discard movements discard; } - // purge: - if ((u_show_purge == 0) && (v_line_type >= 10.5) && (v_line_type <= 11.5)) { - // discard movements - discard; - } frag_color = v_color; } @@ -156,7 +144,6 @@ u_show_travel_moves = 0 u_show_helpers = 1 u_show_skin = 1 u_show_infill = 1 -u_show_purge = 1 [bindings] u_modelViewProjectionMatrix = model_view_projection_matrix diff --git a/plugins/LayerView/layers3d.shader b/plugins/LayerView/layers3d.shader index ef6286c831..6f5e986eec 100755 --- a/plugins/LayerView/layers3d.shader +++ b/plugins/LayerView/layers3d.shader @@ -71,7 +71,6 @@ geometry41core = uniform int u_show_helpers; uniform int u_show_skin; uniform int u_show_infill; - uniform int u_show_purge; layout(lines) in; layout(triangle_strip, max_vertices = 26) out; @@ -126,9 +125,6 @@ geometry41core = if ((u_show_infill == 0) && (v_line_type[0] == 6)) { return; } - if ((u_show_purge == 0) && (v_line_type[0] == 11)) { - return; - } if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { // fixed size for movements @@ -250,7 +246,6 @@ u_show_travel_moves = 0 u_show_helpers = 1 u_show_skin = 1 u_show_infill = 1 -u_show_purge = 1 [bindings] u_modelViewProjectionMatrix = model_view_projection_matrix diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index e2de9e230d..a36f271fe8 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -246,8 +246,7 @@ "layerview_support_infill": [0, 255, 255, 255], "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 128, 255, 255], - "layerview_support_interface": [64, 192, 255, 255], - "layerview_purge": [101, 51, 175, 255] + "layerview_support_interface": [64, 192, 255, 255] }, "sizes": { @@ -307,7 +306,7 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [1.0, 1.0], - "layerview_menu_size": [16.5, 23.0], + "layerview_menu_size": [16.5, 21.0], "layerview_menu_size_compatibility": [22, 23.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], From 83b3dcbb2f68f5b4852ee15a34e499285f8f670c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 13:32:19 +0200 Subject: [PATCH 080/379] Freshly installed plugins can't be downloaded again anymore CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 4a9041d835..36b41a074b 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -43,6 +43,10 @@ class PluginBrowser(QObject, Extension): self._is_downloading = False + # Installed plugins are really installed after reboot. In order to prevent the user from downloading the + # same file over and over again, we keep track of the upgraded plugins. + self._newly_installed_plugin_ids = [] + pluginsMetadataChanged = pyqtSignal() onDownloadProgressChanged = pyqtSignal() @@ -97,6 +101,12 @@ class PluginBrowser(QObject, Extension): self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") self._temp_plugin_file.write(self._download_plugin_reply.readAll()) result = PluginRegistry.getInstance().installPlugin("file://" + self._temp_plugin_file.name) + if result["status"] == "ok": + self._newly_installed_plugin_ids.append(result["id"]) + self.pluginsMetadataChanged.emit() + else: + # TODO; Handle cases where, for some reason, we could not install the plugin + pass self._temp_plugin_file.close() # Plugin was installed, delete temp file @pyqtProperty(int, notify = onDownloadProgressChanged) @@ -134,11 +144,10 @@ class PluginBrowser(QObject, Extension): "version": metadata["version"], "short_description": metadata["short_description"], "author": metadata["author"], - "already_installed": self._checkAlreadyInstalled(metadata["id"], metadata["version"]), + "already_installed": self._checkAlreadyInstalled(metadata["id"]), "file_location": metadata["file_location"], "can_upgrade": self._checkCanUpgrade(metadata["id"], metadata["version"]) }) - print(items) self._plugins_model.setItems(items) return self._plugins_model @@ -146,18 +155,22 @@ class PluginBrowser(QObject, Extension): plugin_registry = PluginRegistry.getInstance() metadata = plugin_registry.getMetaData(id) if metadata != {}: + if id in self._newly_installed_plugin_ids: + return False # We already updated this plugin. current_version = Version(metadata["plugin"]["version"]) new_version = Version(version) if new_version > current_version: return True return False - def _checkAlreadyInstalled(self, id, version): + def _checkAlreadyInstalled(self, id): plugin_registry = PluginRegistry.getInstance() metadata = plugin_registry.getMetaData(id) if metadata != {}: return True else: + if id in self._newly_installed_plugin_ids: + return True # We already installed this plugin, but the registry just doesn't know it yet. return False def _onRequestFinished(self, reply): From eb254b085ac2434e932d0e320734c9b659b9a9e8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 23 Jun 2017 13:34:09 +0200 Subject: [PATCH 081/379] Use "Prime Tower Purge Volume" for setting label CURA-3094 --- 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 b150550bb0..24bfcdde8f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4416,7 +4416,7 @@ }, "prime_tower_purge_volume": { - "label": "Wipe Tower Purge Volume", + "label": "Prime Tower Purge Volume", "description": "Amount of filament to be purged when wiping on prime tower. This is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", "type": "float", "enabled": "resolveOrValue('prime_tower_enable')", From 2438effe0a550b287dd59d4cb747adfdcd5a3c0e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 23 Jun 2017 13:34:19 +0200 Subject: [PATCH 082/379] Use 0.5 as max warning value for prime tower purge volume CURA-3094 Purging more than 0.5mm^3 of material can be way too much, so we use 0.5mm^3 as the maximum warning value for the prime tower purge volume. --- 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 24bfcdde8f..94d0087422 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4423,7 +4423,7 @@ "unit": "mm³", "default_value": 0, "minimum_value": "0", - "maximum_value_warning": "5", + "maximum_value_warning": "0.5", "settable_per_mesh": false, "settable_per_extruder": true }, From 867dd04681c5a71b240573ac7fde9c91bdb77207 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 13:43:08 +0200 Subject: [PATCH 083/379] PluginBrowser strings are now translatable CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 112 +++++++++++++----------- 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 10f20b7343..e53a7847fd 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -8,67 +8,81 @@ UM.Dialog { id: base - title: "Find & Update plugins" + title: catalog.i18nc("@title:window", "Find & Update plugins") width: 450 height: 450 - ScrollView - { - width: parent.width - height: parent.height - progressbar.height - UM.Theme.getSize("default_margin").height - frameVisible: true - ListView - { - id: pluginList - model: manager.pluginsModel - anchors.fill: parent - - delegate: pluginDelegate - } - } - ProgressBar - { - id: progressbar - anchors.bottom: parent.bottom - style: UM.Theme.styles.progressbar - minimumValue: 0; - maximumValue: 100 - width: parent.width - height: 20 - value: manager.downloadProgress - } - Item { - SystemPalette { id: palette } - Component + anchors.fill: parent + Label { - id: pluginDelegate - Rectangle + id: introText + text: catalog.i18nc("@label", "Here you can find a list of Third Party plugins.") + width: parent.width + height: 30 + } + ScrollView + { + width: parent.width + anchors.top: introText.bottom + anchors.bottom: progressbar.top + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + frameVisible: true + ListView { - width: pluginList.width; - height: childrenRect.height; - color: index % 2 ? palette.base : palette.alternateBase - Row + id: pluginList + model: manager.pluginsModel + anchors.fill: parent + + delegate: pluginDelegate + } + } + ProgressBar + { + id: progressbar + anchors.bottom: parent.bottom + style: UM.Theme.styles.progressbar + minimumValue: 0; + maximumValue: 100 + width: parent.width + height: 20 + value: manager.downloadProgress + } + + Item + { + SystemPalette { id: palette } + Component + { + id: pluginDelegate + Rectangle { - width: childrenRect.width + width: pluginList.width; height: childrenRect.height; - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - Label + color: index % 2 ? palette.base : palette.alternateBase + Row { - text: model.name - width: contentWidth + width: childrenRect.width + height: childrenRect.height; + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + Label + { + text: model.name + width: contentWidth + } + } + Button + { + text: !model.already_installed ? catalog.i18nc("@action:button", "Download") : model.can_upgrade ? catalog.i18nc("@action:button", "Upgrade") : catalog.i18nc("@action:button", "Download") + onClicked: manager.downloadAndInstallPlugin(model.file_location) + anchors.right: parent.right + enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading } } - Button - { - text: !model.already_installed ? "Download" : model.can_upgrade ? "Upgrade" : "Download" - onClicked: manager.downloadAndInstallPlugin(model.file_location) - anchors.right: parent.right - enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading - } - } + } } + UM.I18nCatalog { id: catalog; name:"cura" } } } \ No newline at end of file From 37162683e5c15d9f31e304bb615d0f016889dc6f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 13:51:13 +0200 Subject: [PATCH 084/379] Show result message after installing / upgrading plugin with the browser CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 36b41a074b..3da805c5b8 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -100,13 +100,14 @@ class PluginBrowser(QObject, Extension): self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") self._temp_plugin_file.write(self._download_plugin_reply.readAll()) + result = PluginRegistry.getInstance().installPlugin("file://" + self._temp_plugin_file.name) - if result["status"] == "ok": - self._newly_installed_plugin_ids.append(result["id"]) - self.pluginsMetadataChanged.emit() - else: - # TODO; Handle cases where, for some reason, we could not install the plugin - pass + + self._newly_installed_plugin_ids.append(result["id"]) + self.pluginsMetadataChanged.emit() + + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) + self._temp_plugin_file.close() # Plugin was installed, delete temp file @pyqtProperty(int, notify = onDownloadProgressChanged) From dbf0cf347cfc50baf7baf8ba48851c6f69399e31 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 23 Jun 2017 13:58:14 +0200 Subject: [PATCH 085/379] Default to 0 if we cannot find the theme CURA-3873 --- resources/qml/Preferences/GeneralPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index f1a18e2829..c1b112cefc 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -237,6 +237,7 @@ UM.PreferencesPage return i } } + return 0; } onActivated: UM.Preferences.setValue("general/theme", model.get(index).code) From 25d2c10548391eeab016379f2a998dd9df77063d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 14:15:27 +0200 Subject: [PATCH 086/379] Optimise Ultimaker 2+ polypropylene profiles These are optimised to the level of the materials: Anything that is common between quality profiles with the same material and nozzle gets bubbled to the profile for that material (per nozzle). It doesn't bubble any further (to the variant) because that could have an impact on the other profiles. This basically only removes settings because where these settings then bubble to is the material profile in the fdm_materials repository. And a lot of settings are just removed because they are equal to the default. Contributes to issue CURA-3960. --- .../ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 20 +------------ .../um2p_pp_0.4_normal.inst.cfg | 21 +------------- .../um2p_pp_0.6_draft.inst.cfg | 29 ++++--------------- .../ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 29 ++++--------------- .../um2p_pp_0.8_draft.inst.cfg | 27 ++++------------- .../ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg | 27 ++++------------- 6 files changed, 24 insertions(+), 129 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index 2e5120b0d7..92f5ffd308 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -11,23 +11,17 @@ quality_type = fast [values] acceleration_enabled = True -acceleration_infill = =acceleration_print acceleration_layer_0 = =acceleration_topbottom acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support acceleration_support_interface = =acceleration_topbottom acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 -cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 gradual_infill_step_height = =layer_height * 2 @@ -38,44 +32,34 @@ infill_pattern = cubic infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True -jerk_infill = =jerk_print jerk_layer_0 = =jerk_topbottom jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall layer_height = 0.15 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 -retraction_amount = 8 retraction_count_max = 12 -retraction_extra_prime_amount = 0 retraction_extrusion_window = 1 retraction_hop = 0.15 retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.5 retraction_prime_speed = 15 -retraction_speed = 35 skin_overlap = 10 -speed_infill = =speed_print speed_layer_0 = 25 speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 250 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -speed_wall_x = =speed_wall support_angle = 60 support_bottom_distance = =support_z_distance / 2 support_top_distance = =support_z_distance @@ -85,9 +69,7 @@ support_z_distance = =layer_height * 2 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.8 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =round(line_width * 0.38 / 0.38, 2) -wall_thickness = 0.76 +wall_thickness = 0.76 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index f311c28fc8..f7bd19e3e2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -11,23 +11,17 @@ quality_type = normal [values] acceleration_enabled = True -acceleration_infill = =acceleration_print acceleration_layer_0 = =acceleration_topbottom acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support acceleration_support_interface = =acceleration_topbottom acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 -cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 gradual_infill_step_height = =layer_height * 2 @@ -38,44 +32,33 @@ infill_pattern = cubic infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True -jerk_infill = =jerk_print jerk_layer_0 = =jerk_topbottom jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall -layer_height = 0.1 -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 -retraction_amount = 8 retraction_count_max = 12 -retraction_extra_prime_amount = 0 retraction_extrusion_window = 1 retraction_hop = 0.15 retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.5 retraction_prime_speed = 15 -retraction_speed = 35 skin_overlap = 10 -speed_infill = =speed_print speed_layer_0 = 25 speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 250 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -speed_wall_x = =speed_wall support_angle = 60 support_bottom_distance = =support_z_distance / 2 support_top_distance = =support_z_distance @@ -85,9 +68,7 @@ support_z_distance = =layer_height * 2 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.8 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =round(line_width * 0.38 / 0.38, 2) -wall_thickness = 0.76 +wall_thickness = 0.76 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index 341a35926a..314ed8ace8 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -10,54 +10,40 @@ weight = 0 quality_type = draft [values] -layer_height = 0.2 -gradual_infill_steps = 3 -retraction_extra_prime_amount = 0 -skirt_brim_line_width = 0.6 -infill_overlap_mm = 0 -skin_overlap = 10 acceleration_enabled = True -acceleration_infill = =acceleration_print acceleration_layer_0 = =acceleration_topbottom acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support acceleration_support_interface = =acceleration_topbottom acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 -cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 gradual_infill_step_height = =layer_height * 2 +gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.6 / 0.57, 2) infill_overlap = 0 +infill_overlap_mm = 0 infill_pattern = cubic infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True -jerk_infill = =jerk_print jerk_layer_0 = =jerk_topbottom jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +layer_height = 0.2 line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 -retraction_amount = 8 retraction_count_max = 12 retraction_extrusion_window = 1 retraction_hop = 0.15 @@ -65,19 +51,17 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.5 retraction_prime_speed = 15 -retraction_speed = 35 -speed_infill = =speed_print +skin_overlap = 10 +skirt_brim_line_width = 0.6 speed_layer_0 = 25 speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 250 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -speed_wall_x = =speed_wall support_angle = 60 support_bottom_distance = =support_z_distance / 2 support_top_distance = =support_z_distance @@ -89,7 +73,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 1.1 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =round(line_width * 0.57 / 0.57, 2) -wall_thickness = 1.14 +wall_thickness = 1.14 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index d1790dde47..89e21dadce 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -10,54 +10,40 @@ weight = -1 quality_type = fast [values] -layer_height = 0.15 -gradual_infill_steps = 3 -retraction_extra_prime_amount = 0 -skirt_brim_line_width = 0.6 -infill_overlap_mm = 0 -skin_overlap = 10 acceleration_enabled = True -acceleration_infill = =acceleration_print acceleration_layer_0 = =acceleration_topbottom acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support acceleration_support_interface = =acceleration_topbottom acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 -cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 gradual_infill_step_height = =layer_height * 2 +gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.6 / 0.57, 2) infill_overlap = 0 +infill_overlap_mm = 0 infill_pattern = cubic infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True -jerk_infill = =jerk_print jerk_layer_0 = =jerk_topbottom jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +layer_height = 0.15 line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 -retraction_amount = 8 retraction_count_max = 12 retraction_extrusion_window = 1 retraction_hop = 0.15 @@ -65,19 +51,17 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.5 retraction_prime_speed = 15 -retraction_speed = 35 -speed_infill = =speed_print +skin_overlap = 10 +skirt_brim_line_width = 0.6 speed_layer_0 = 25 speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 250 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -speed_wall_x = =speed_wall support_angle = 60 support_bottom_distance = =support_z_distance / 2 support_top_distance = =support_z_distance @@ -89,7 +73,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 1.1 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =round(line_width * 0.57 / 0.57, 2) -wall_thickness = 1.14 +wall_thickness = 1.14 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 2a6397d2e8..926f75066d 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -10,54 +10,40 @@ weight = 0 quality_type = draft [values] -layer_height = 0.3 -gradual_infill_steps = 3 -retraction_extra_prime_amount = 0 -skirt_brim_line_width = 0.8 -infill_overlap_mm = 0 -skin_overlap = 10 acceleration_enabled = True -acceleration_infill = =acceleration_print acceleration_layer_0 = =acceleration_topbottom acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support acceleration_support_interface = =acceleration_topbottom acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 -cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 gradual_infill_step_height = =layer_height * 2 +gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 +infill_overlap_mm = 0 infill_pattern = cubic infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True -jerk_infill = =jerk_print jerk_layer_0 = =jerk_topbottom jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +layer_height = 0.3 line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 -retraction_amount = 8 retraction_count_max = 12 retraction_extrusion_window = 1 retraction_hop = 0.15 @@ -65,19 +51,17 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.5 retraction_prime_speed = 15 -retraction_speed = 35 -speed_infill = =speed_print +skin_overlap = 10 +skirt_brim_line_width = 0.8 speed_layer_0 = 25 speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 250 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -speed_wall_x = =speed_wall support_angle = 60 support_bottom_distance = =support_z_distance / 2 support_top_distance = =support_z_distance @@ -89,7 +73,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 1.5 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =round(line_width * 0.76 / 0.76, 2) wall_thickness = 1.52 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg index 185597ef74..1891f57644 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg @@ -10,54 +10,40 @@ weight = 0 quality_type = fast [values] -layer_height = 0.2 -gradual_infill_steps = 3 -retraction_extra_prime_amount = 0 -skirt_brim_line_width = 0.8 -infill_overlap_mm = 0 -skin_overlap = 10 acceleration_enabled = True -acceleration_infill = =acceleration_print acceleration_layer_0 = =acceleration_topbottom acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) acceleration_print = 4000 acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_infill = =acceleration_support acceleration_support_interface = =acceleration_topbottom acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -acceleration_wall_x = =acceleration_wall -adhesion_type = brim brim_width = 20 cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed = 20 cool_fan_speed_max = 100 -cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 gradual_infill_step_height = =layer_height * 3 +gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 +infill_overlap_mm = 0 infill_pattern = cubic infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True -jerk_infill = =jerk_print jerk_layer_0 = =jerk_topbottom jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_infill = =jerk_support jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -jerk_wall_x = =jerk_wall -layer_height_0 = =round(machine_nozzle_size / 1.5, 2) +layer_height = 0.2 line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 -retraction_amount = 8 retraction_count_max = 12 retraction_extrusion_window = 1 retraction_hop = 0.15 @@ -65,19 +51,17 @@ retraction_hop_enabled = True retraction_hop_only_when_collides = True retraction_min_travel = 0.5 retraction_prime_speed = 15 -retraction_speed = 35 -speed_infill = =speed_print +skin_overlap = 10 +skirt_brim_line_width = 0.8 speed_layer_0 = 25 speed_prime_tower = =speed_topbottom speed_print = 25 -speed_support = =speed_wall_0 speed_support_interface = =speed_topbottom speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_travel = 250 speed_travel_layer_0 = 50 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -speed_wall_x = =speed_wall support_angle = 60 support_bottom_distance = =support_z_distance / 2 support_top_distance = =support_z_distance @@ -89,7 +73,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 top_bottom_thickness = 1.5 travel_avoid_distance = 3 -travel_compensate_overlapping_walls_enabled = True wall_0_inset = 0 wall_line_width_x = =round(line_width * 0.76 / 0.76, 2) wall_thickness = 1.52 \ No newline at end of file From 32c699e4a1102a2f98e30cc3cdf481043329cd31 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 14:17:22 +0200 Subject: [PATCH 087/379] Updated layout --- plugins/PluginBrowser/PluginBrowser.qml | 27 ++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index e53a7847fd..f8b7abe975 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -9,7 +9,7 @@ UM.Dialog id: base title: catalog.i18nc("@title:window", "Find & Update plugins") - width: 450 + width: 600 height: 450 Item { @@ -60,24 +60,41 @@ UM.Dialog width: pluginList.width; height: childrenRect.height; color: index % 2 ? palette.base : palette.alternateBase - Row + Column { - width: childrenRect.width - height: childrenRect.height; + width: parent.width + height: childrenRect.height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: downloadButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width Label { - text: model.name + text: "" + model.name + " - " + model.author width: contentWidth + height: contentHeight + UM.Theme.getSize("default_margin").height + verticalAlignment: Text.AlignVCenter + } + + Label + { + text: model.short_description + width: parent.width + height: contentHeight + UM.Theme.getSize("default_margin").height + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter } } Button { + id: downloadButton text: !model.already_installed ? catalog.i18nc("@action:button", "Download") : model.can_upgrade ? catalog.i18nc("@action:button", "Upgrade") : catalog.i18nc("@action:button", "Download") onClicked: manager.downloadAndInstallPlugin(model.file_location) anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading + } } From 504bf5067c492124bd370c2d6846053a2f7981df Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 14:24:14 +0200 Subject: [PATCH 088/379] Fix metadata of Ultimaker 2+ propylene profiles Note that Git says that Fast was renamed to Verydraft, but in reality Fast was renamed to Draft and Draft was renamed to Verydraft. Contributes to issue CURA-3960. --- .../quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 4 ++-- .../ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg | 2 +- .../quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg | 4 ++-- .../quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 2 +- .../quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 10 +++++----- ....8_fast.inst.cfg => um2p_pp_0.8_verydraft.inst.cfg} | 10 +++++----- 6 files changed, 16 insertions(+), 16 deletions(-) rename resources/quality/ultimaker2_plus/{um2p_pp_0.8_fast.inst.cfg => um2p_pp_0.8_verydraft.inst.cfg} (94%) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index 92f5ffd308..0126c9c2f2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -1,12 +1,12 @@ [general] version = 2 -name = Fast Quality +name = Normal definition = ultimaker2_plus [metadata] type = quality material = generic_polypropylene_ultimaker2_plus_0.4_mm -weight = 0 +weight = -1 quality_type = fast [values] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index f7bd19e3e2..380c5c0a53 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Normal Quality +name = Fine definition = ultimaker2_plus [metadata] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index 314ed8ace8..b968b08ad2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -1,12 +1,12 @@ [general] version = 2 -name = Draft Print +name = Fast definition = ultimaker2_plus [metadata] type = quality material = generic_polypropylene_ultimaker2_plus_0.6_mm -weight = 0 +weight = -2 quality_type = draft [values] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index 89e21dadce..f54040463c 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast Print +name = Fast definition = ultimaker2_plus [metadata] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 926f75066d..a7ba848950 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -1,13 +1,13 @@ [general] version = 2 -name = Draft Print +name = Fast Print definition = ultimaker2_plus [metadata] type = quality material = generic_polypropylene_ultimaker2_plus_0.8_mm -weight = 0 -quality_type = draft +weight = -2 +quality_type = fast [values] acceleration_enabled = True @@ -24,7 +24,7 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 2 +gradual_infill_step_height = =layer_height * 3 gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 @@ -41,7 +41,7 @@ jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -layer_height = 0.3 +layer_height = 0.2 line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 retraction_count_max = 12 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg similarity index 94% rename from resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg rename to resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 1891f57644..7277ba8363 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -1,13 +1,13 @@ [general] version = 2 -name = Fast Print +name = Extra Fast definition = ultimaker2_plus [metadata] type = quality material = generic_polypropylene_ultimaker2_plus_0.8_mm -weight = 0 -quality_type = fast +weight = -3 +quality_type = draft [values] acceleration_enabled = True @@ -24,7 +24,7 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 3 +gradual_infill_step_height = =layer_height * 2 gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 @@ -41,7 +41,7 @@ jerk_support_interface = =jerk_topbottom jerk_topbottom = =math.ceil(jerk_print * 5 / 25) jerk_wall = =math.ceil(jerk_print * 10 / 25) jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -layer_height = 0.2 +layer_height = 0.3 line_width = =machine_nozzle_size * 0.95 multiple_mesh_overlap = 0 retraction_count_max = 12 From 269bc5f61fde291ff98c7bd6fa40e57553603730 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 14:34:52 +0200 Subject: [PATCH 089/379] Correct setting version of UM2+ polypropylene profiles Missed that one, but thankfully the Cura log reminds us. Contributes to issue CURA-3960. --- resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 1 + resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg | 1 + resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg | 1 + resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 1 + resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 1 + resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg | 1 + 6 files changed, 6 insertions(+) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index 0126c9c2f2..53cc10468d 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -8,6 +8,7 @@ type = quality material = generic_polypropylene_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast +setting_version = 1 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index 380c5c0a53..9805becd93 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -8,6 +8,7 @@ type = quality material = generic_polypropylene_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal +setting_version = 1 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index b968b08ad2..3060cd3a0f 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -8,6 +8,7 @@ type = quality material = generic_polypropylene_ultimaker2_plus_0.6_mm weight = -2 quality_type = draft +setting_version = 1 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index f54040463c..b1194693ac 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -8,6 +8,7 @@ type = quality material = generic_polypropylene_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast +setting_version = 1 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index a7ba848950..039f24bfe0 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -8,6 +8,7 @@ type = quality material = generic_polypropylene_ultimaker2_plus_0.8_mm weight = -2 quality_type = fast +setting_version = 1 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 7277ba8363..9bcd29dfa4 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -8,6 +8,7 @@ type = quality material = generic_polypropylene_ultimaker2_plus_0.8_mm weight = -3 quality_type = draft +setting_version = 1 [values] acceleration_enabled = True From 8a8123a021ca0b570483473b9fe65511cee71322 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 14:35:15 +0200 Subject: [PATCH 090/379] Correctly set User-Agent header --- plugins/PluginBrowser/PluginBrowser.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 3da805c5b8..02f50e7a02 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -43,6 +43,8 @@ class PluginBrowser(QObject, Extension): self._is_downloading = False + self._request_header = [b"User-Agent", str.encode("%s - %s" % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()))] + # Installed plugins are really installed after reboot. In order to prevent the user from downloading the # same file over and over again, we keep track of the upgraded plugins. self._newly_installed_plugin_ids = [] @@ -67,6 +69,7 @@ class PluginBrowser(QObject, Extension): def requestPluginList(self): url = QUrl(self._api_url + "plugins") self._plugin_list_request = QNetworkRequest(url) + self._plugin_list_request.setRawHeader(*self._request_header) self._network_manager.get(self._plugin_list_request) def _createDialog(self): @@ -119,6 +122,7 @@ class PluginBrowser(QObject, Extension): Logger.log("i", "Attempting to download & install plugin from %s", url) url = QUrl(url) self._download_plugin_request = QNetworkRequest(url) + self._download_plugin_request.setRawHeader(*self._request_header) self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) self._download_progress = 0 self.setIsDownloading(True) From 31dcb6f41f958ea2818473f26b7c9dfd4658073e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 14:41:23 +0200 Subject: [PATCH 091/379] Decreased height of progress bar CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index f8b7abe975..be44ab854a 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -45,7 +45,7 @@ UM.Dialog minimumValue: 0; maximumValue: 100 width: parent.width - height: 20 + height: 10 value: manager.downloadProgress } From ccb3f225ff7e435c5903b94644ae08da19b6adf9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 23 Jun 2017 15:49:46 +0200 Subject: [PATCH 092/379] Preheat now shows error color like all other input fields --- resources/qml/PrintMonitor.qml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index eacdc17883..41e8794014 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -320,7 +320,17 @@ Column Rectangle //Input field for pre-heat temperature. { id: preheatTemperatureControl - color: !enabled ? UM.Theme.getColor("setting_control_disabled") : UM.Theme.getColor("setting_validation_ok") + color: !enabled ? UM.Theme.getColor("setting_control_disabled") : showError ? UM.Theme.getColor("setting_validation_error") : UM.Theme.getColor("setting_validation_ok") + property var showError: + { + if(bedTemperature.properties.maximum_value != "None" && bedTemperature.properties.maximum_value < parseInt(preheatTemperatureInput.text)) + { + return true; + } else + { + return false; + } + } enabled: { if (connectedPrinter == null) From dc638fecbf2d91ddbaf62da42a20aa65192e391b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 16:04:06 +0200 Subject: [PATCH 093/379] Mark 0.8mm CPE+ and PC profiles as experimental These profiles have been tested and they are in the process of optimising them, but there is still some room for improvement there so this is supposed to lower the expectations of our users. Contributes to issue CURA-3960. --- .../quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg index b58210badf..fbcde6cdeb 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast +name = Fast - Experimental definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index f29b630f48..128dbe5ca5 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Sprint +name = Sprint - Experimental definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index 589892f11b..7d8dc79748 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Extra Fast +name = Extra Fast - Experimental definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg index 5617be141d..7cff30cdb2 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast +name = Fast - Experimental definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg index 3f6dadbb73..8ca95994e4 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Sprint +name = Sprint - Experimental definition = ultimaker3 [metadata] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg index ff5d6a0a5f..62b06e7df7 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Extra Fast +name = Extra Fast - Experimental definition = ultimaker3 [metadata] From b68d8d98bec8cc4846cd1dd662d7775973480cd9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 16:36:53 +0200 Subject: [PATCH 094/379] Update Korean translations These files are directly copied from our Korean translator. Contributes to issue CURA-3950. --- resources/i18n/ko/fdmextruder.def.json.po | 73 +- resources/i18n/ko/fdmprinter.def.json.po | 799 +++++++++++----------- 2 files changed, 437 insertions(+), 435 deletions(-) diff --git a/resources/i18n/ko/fdmextruder.def.json.po b/resources/i18n/ko/fdmextruder.def.json.po index 6b3ff3996e..4286843f2b 100644 --- a/resources/i18n/ko/fdmextruder.def.json.po +++ b/resources/i18n/ko/fdmextruder.def.json.po @@ -8,183 +8,184 @@ msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-03-27 17:27+0000\n" +"PO-Revision-Date: 2017-06-19 17:36+0900\n" "Last-Translator: None\n" "Language-Team: None\n" -"Language: Korean\n" +"Language: ko\n" "Lang-Code: ko\n" "Country-Code: KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.0.1\n" #: fdmextruder.def.json msgctxt "machine_settings label" msgid "Machine" -msgstr "" +msgstr "장비 " #: fdmextruder.def.json msgctxt "machine_settings description" msgid "Machine specific settings" -msgstr "" +msgstr "장비 별 설정 " #: fdmextruder.def.json msgctxt "extruder_nr label" msgid "Extruder" -msgstr "" +msgstr "압출기 " #: fdmextruder.def.json msgctxt "extruder_nr description" msgid "The extruder train used for printing. This is used in multi-extrusion." -msgstr "" +msgstr "인쇄에 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmextruder.def.json msgctxt "machine_nozzle_size label" msgid "Nozzle Diameter" -msgstr "" +msgstr "노즐 지름" #: fdmextruder.def.json msgctxt "machine_nozzle_size description" msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." -msgstr "" +msgstr "노즐의 내경. 비표준 노즐 크기를 사용할 때, 본 설정을 변경하십시오. " #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x label" msgid "Nozzle X Offset" -msgstr "" +msgstr "노즐 X 오프셋 " #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x description" msgid "The x-coordinate of the offset of the nozzle." -msgstr "" +msgstr "노즐 오프셋의 x 좌표입니다. " #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y label" msgid "Nozzle Y Offset" -msgstr "" +msgstr "노즐 Y 오프셋" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y description" msgid "The y-coordinate of the offset of the nozzle." -msgstr "" +msgstr "노즐 오프셋의 y 좌표입니다. " #: fdmextruder.def.json msgctxt "machine_extruder_start_code label" msgid "Extruder Start G-Code" -msgstr "" +msgstr "압출기 시작 G 코드" #: fdmextruder.def.json msgctxt "machine_extruder_start_code description" msgid "Start g-code to execute whenever turning the extruder on." -msgstr "" +msgstr "압출기를 켤 때마다 실행할 g 코드를 시작하십시오. " #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_abs label" msgid "Extruder Start Position Absolute" -msgstr "" +msgstr "압출기 시작 위치의 절대 값 " #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_abs description" msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head." -msgstr "" +msgstr "압출기 시작 위치를 헤드의 마지막으로 알려진 위치에 상대적이 아닌 절대 위치로 만듭니다." #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x label" msgid "Extruder Start Position X" -msgstr "" +msgstr "압출기 시작 X의 위치 " #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x description" msgid "The x-coordinate of the starting position when turning the extruder on." -msgstr "" +msgstr "압출기를 켤 때 시작 위치의 x 좌표. " #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y label" msgid "Extruder Start Position Y" -msgstr "" +msgstr "압출기 시작 위치 Y " #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y description" msgid "The y-coordinate of the starting position when turning the extruder on." -msgstr "" +msgstr "압출기를 켤 때 시작 위치의 y 좌표입니다. " #: fdmextruder.def.json msgctxt "machine_extruder_end_code label" msgid "Extruder End G-Code" -msgstr "" +msgstr "압출기 최종 G 코드 " #: fdmextruder.def.json msgctxt "machine_extruder_end_code description" msgid "End g-code to execute whenever turning the extruder off." -msgstr "" +msgstr "압출기를 끌 때마다 실행할 g 코드를 종료하십시오. " #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_abs label" msgid "Extruder End Position Absolute" -msgstr "" +msgstr "압출기 끝 절대 위치 " #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_abs description" msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head." -msgstr "" +msgstr "압출 성형기가 헤드의 마지막으로 알려진 위치에 상대적이 아닌 절대 위치로 끝나도록하십시오. " #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x label" msgid "Extruder End Position X" -msgstr "" +msgstr "압출기 끝 X 위치 " #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x description" msgid "The x-coordinate of the ending position when turning the extruder off." -msgstr "" +msgstr "압출기를 끌 때 끝 위치의 x 좌표." #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y label" msgid "Extruder End Position Y" -msgstr "" +msgstr "압출기 끝 Y 위치 " #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y description" msgid "The y-coordinate of the ending position when turning the extruder off." -msgstr "" +msgstr "압출기를 끌 때 종료 위치의 y 좌표입니다. " #: fdmextruder.def.json msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "" +msgstr "압출기 프라임 Z 위치 " #: fdmextruder.def.json msgctxt "extruder_prime_pos_z description" msgid "The Z coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "인쇄가 시작될 때 노즐이 끝나는 위치의 Z 좌표입니다. " #: fdmextruder.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "" +msgstr "플레이트 접착력 강화 " #: fdmextruder.def.json msgctxt "platform_adhesion description" msgid "Adhesion" -msgstr "" +msgstr "부착 " #: fdmextruder.def.json msgctxt "extruder_prime_pos_x label" msgid "Extruder Prime X Position" -msgstr "" +msgstr "압출기 프라임 X 위치 " #: fdmextruder.def.json msgctxt "extruder_prime_pos_x description" msgid "The X coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 X 좌표입니다. " #: fdmextruder.def.json msgctxt "extruder_prime_pos_y label" msgid "Extruder Prime Y Position" -msgstr "" +msgstr "압출기 프라임 Y 위치 " #: fdmextruder.def.json msgctxt "extruder_prime_pos_y description" msgid "The Y coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 Y 좌표입니다. " diff --git a/resources/i18n/ko/fdmprinter.def.json.po b/resources/i18n/ko/fdmprinter.def.json.po index 20286de71c..bf3fb5159c 100644 --- a/resources/i18n/ko/fdmprinter.def.json.po +++ b/resources/i18n/ko/fdmprinter.def.json.po @@ -8,14 +8,15 @@ msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-03-27 17:27+0000\n" +"PO-Revision-Date: 2017-06-23 16:16+0900\n" "Last-Translator: None\n" "Language-Team: None\n" -"Language: Korean\n" +"Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.0.2\n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -25,7 +26,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_settings description" msgid "Machine specific settings" -msgstr "" +msgstr "기계 별 설정 " #: fdmprinter.def.json msgctxt "machine_name label" @@ -35,7 +36,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_name description" msgid "The name of your 3D printer model." -msgstr "" +msgstr "3D 프린터 모델의 이름입니다. " #: fdmprinter.def.json msgctxt "machine_show_variants label" @@ -45,7 +46,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_show_variants description" msgid "Whether to show the different variants of this machine, which are described in separate json files." -msgstr "" +msgstr "별도의 json 파일에 설명 된이 기계의 다양한 변형을 표시할지 여부 " #: fdmprinter.def.json msgctxt "machine_start_gcode label" @@ -57,7 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" +msgstr "G 시작과 동시에 실행될 코드 명령어 " #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -69,7 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" +msgstr "G 맨 마지막에 실행될 코드 명령 " #: fdmprinter.def.json msgctxt "material_guid label" @@ -79,7 +80,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_guid description" msgid "GUID of the material. This is set automatically. " -msgstr "" +msgstr "재료의 GUID. 자동으로 설정됩니다. " #: fdmprinter.def.json msgctxt "material_bed_temp_wait label" @@ -89,7 +90,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temp_wait description" msgid "Whether to insert a command to wait until the build plate temperature is reached at the start." -msgstr "" +msgstr "시작 시, 빌드 플레이트 온도에 도달 할 때까지 대기하라는 명령을 삽입할지 여부 " #: fdmprinter.def.json msgctxt "material_print_temp_wait label" @@ -99,7 +100,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_print_temp_wait description" msgid "Whether to wait until the nozzle temperature is reached at the start." -msgstr "" +msgstr "시작 시, 노즐 온도에 도달 할 때까지 대기할지 여부 " #: fdmprinter.def.json msgctxt "material_print_temp_prepend label" @@ -109,7 +110,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_print_temp_prepend description" msgid "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting." -msgstr "" +msgstr "gcode의 시작 부분에 노즐 온도 명령을 포함할지 여부. start_gcode에 이미 노즐 온도 명령이 포함되어있을 때 Cura 프론트 엔드는이 설정을 자동으로 비활성화합니다. " #: fdmprinter.def.json msgctxt "material_bed_temp_prepend label" @@ -119,7 +120,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temp_prepend description" msgid "Whether to include build plate temperature commands at the start of the gcode. When the start_gcode already contains build plate temperature commands Cura frontend will automatically disable this setting." -msgstr "" +msgstr "gcode가 시작될 때 빌드 플레이트 온도 명령을 포함할지 여부. start_gcode에 빌드 플레이트 온도 명령이 이미 있으면 Cura 프론트는이 설정을 자동으로 비활성화합니다. " #: fdmprinter.def.json msgctxt "machine_width label" @@ -129,7 +130,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_width description" msgid "The width (X-direction) of the printable area." -msgstr "" +msgstr "인쇄 가능 영역의 폭 (X 방향) " #: fdmprinter.def.json msgctxt "machine_depth label" @@ -139,7 +140,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_depth description" msgid "The depth (Y-direction) of the printable area." -msgstr "" +msgstr "인쇄 가능 영역의 깊이 (Y 방향) " #: fdmprinter.def.json msgctxt "machine_shape label" @@ -149,7 +150,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_shape description" msgid "The shape of the build plate without taking unprintable areas into account." -msgstr "" +msgstr "인쇄 할 수없는 영역을 고려하지 않고 빌드 플레이트의 모양 " #: fdmprinter.def.json msgctxt "machine_shape option rectangular" @@ -169,7 +170,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_height description" msgid "The height (Z-direction) of the printable area." -msgstr "" +msgstr "인쇄 가능 영역의 높이 (Z 방향)입니다. " #: fdmprinter.def.json msgctxt "machine_heated_bed label" @@ -179,7 +180,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_heated_bed description" msgid "Whether the machine has a heated build plate present." -msgstr "" +msgstr "기계에 가열 된 빌드 플레이트가 있는지 여부 " #: fdmprinter.def.json msgctxt "machine_center_is_zero label" @@ -189,7 +190,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_center_is_zero description" msgid "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area." -msgstr "" +msgstr "프린터의 \"0\" 위치의 X / Y 좌표가 인쇄 가능 영역의 중앙에 있는지 여부 " #: fdmprinter.def.json msgctxt "machine_extruder_count label" @@ -199,7 +200,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_extruder_count description" msgid "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle." -msgstr "" +msgstr "압출기 열차의 수. 압출기 트레인은 피더, 보우 덴 튜브 및 노즐의 조합입니다. " #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter label" @@ -209,7 +210,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter description" msgid "The outer diameter of the tip of the nozzle." -msgstr "" +msgstr "노즐 끝의 외경 " #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance label" @@ -219,7 +220,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance description" msgid "The height difference between the tip of the nozzle and the lowest part of the print head." -msgstr "" +msgstr "노즐의 끝과 프린트 헤드의 가장 낮은 부분 사이의 높이 차이입니다. " #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle label" @@ -229,7 +230,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle description" msgid "The angle between the horizontal plane and the conical part right above the tip of the nozzle." -msgstr "" +msgstr "노즐 끝 바로 위의 수평면과 원뿔 부분 사이의 각도입니다. " #: fdmprinter.def.json msgctxt "machine_heat_zone_length label" @@ -239,7 +240,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_heat_zone_length description" msgid "The distance from the tip of the nozzle in which heat from the nozzle is transferred to the filament." -msgstr "" +msgstr "노즐의 열이 필라멘트로 전달되는 노즐의 끝에서부터의 거리 " #: fdmprinter.def.json msgctxt "machine_filament_park_distance label" @@ -249,7 +250,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_filament_park_distance description" msgid "The distance from the tip of the nozzle where to park the filament when an extruder is no longer used." -msgstr "" +msgstr "압출기가 더 이상 사용되지 않을 때 필라멘트를 파킹 할 노즐의 끝에서부터의 거리 " #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled label" @@ -259,7 +260,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled description" msgid "Whether to control temperature from Cura. Turn this off to control nozzle temperature from outside of Cura." -msgstr "" +msgstr "Cura에서 온도를 제어할지 여부. Cura 외부에서 노즐 온도를 제어하려면이 기능을 끄십시오 " #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed label" @@ -269,7 +270,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed description" msgid "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature." -msgstr "" +msgstr "노즐이 가열되는 속도 (° C / s)는 일반적인 인쇄 온도와 대기 온도의 창에서 평균을냅니다. " #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed label" @@ -279,7 +280,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed description" msgid "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature." -msgstr "" +msgstr "노즐이 냉각되는 속도 (° C / s)는 일반적인 인쇄 온도 및 대기 온도의 창에서 평균화됩니다. " #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window label" @@ -289,7 +290,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window description" msgid "The minimal time an extruder has to be inactive before the nozzle is cooled. Only when an extruder is not used for longer than this time will it be allowed to cool down to the standby temperature." -msgstr "" +msgstr "노즐이 냉각되기 전에 압출기가 비활성이어야하는 최소 시간. 이 시간보다 오래 압출기를 사용하지 않을 경우에만 대기 온도로 냉각시킬 수 있습니다. " #: fdmprinter.def.json msgctxt "machine_gcode_flavor label" @@ -299,7 +300,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_gcode_flavor description" msgid "The type of gcode to be generated." -msgstr "" +msgstr "생성 될 gcode 유형입니다. " #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" @@ -349,7 +350,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_disallowed_areas description" msgid "A list of polygons with areas the print head is not allowed to enter." -msgstr "" +msgstr "인쇄 헤드가있는 영역이있는 다각형 목록입니다. " #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas label" @@ -359,7 +360,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas description" msgid "A list of polygons with areas the nozzle is not allowed to enter." -msgstr "" +msgstr "노즐이 들어갈 수없는 영역이있는 다각형 목록입니다. " #: fdmprinter.def.json msgctxt "machine_head_polygon label" @@ -369,7 +370,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_head_polygon description" msgid "A 2D silhouette of the print head (fan caps excluded)." -msgstr "" +msgstr "프린트 헤드의 2D 실루엣 (팬 캡 제외). " #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon label" @@ -379,7 +380,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon description" msgid "A 2D silhouette of the print head (fan caps included)." -msgstr "" +msgstr "프린트 헤드의 2D 실루엣 (팬 뚜껑 포함). " #: fdmprinter.def.json msgctxt "gantry_height label" @@ -389,7 +390,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "gantry_height description" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes)." -msgstr "" +msgstr "노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). " #: fdmprinter.def.json msgctxt "machine_nozzle_size label" @@ -399,7 +400,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_nozzle_size description" msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." -msgstr "" +msgstr "노즐의 내경. 비표준 노즐 크기를 사용할 때이 설정을 변경하십시오. " #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords label" @@ -409,7 +410,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords description" msgid "Apply the extruder offset to the coordinate system." -msgstr "" +msgstr "압출기 오프셋을 좌표계에 적용하십시오. " #: fdmprinter.def.json msgctxt "extruder_prime_pos_z label" @@ -419,7 +420,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "extruder_prime_pos_z description" msgid "The Z coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "인쇄가 시작될 때 노즐이 끝나는 위치의 Z 좌표입니다. " #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs label" @@ -429,7 +430,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs description" msgid "Make the extruder prime position absolute rather than relative to the last-known location of the head." -msgstr "" +msgstr "헤드의 마지막으로 알려진 위치에 상대적이 아닌 압출기의 주요 위치를 절대 위치로 만듭니다. " #: fdmprinter.def.json msgctxt "machine_max_feedrate_x label" @@ -439,7 +440,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_feedrate_x description" msgid "The maximum speed for the motor of the X-direction." -msgstr "" +msgstr "X 방향의 모터 최대 속도입니다." #: fdmprinter.def.json msgctxt "machine_max_feedrate_y label" @@ -449,7 +450,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_feedrate_y description" msgid "The maximum speed for the motor of the Y-direction." -msgstr "" +msgstr "Y 방향 모터의 최대 속도입니다." #: fdmprinter.def.json msgctxt "machine_max_feedrate_z label" @@ -459,7 +460,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_feedrate_z description" msgid "The maximum speed for the motor of the Z-direction." -msgstr "" +msgstr "Z 방향의 모터 최대 속도입니다. " #: fdmprinter.def.json msgctxt "machine_max_feedrate_e label" @@ -469,7 +470,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_feedrate_e description" msgid "The maximum speed of the filament." -msgstr "" +msgstr "필라멘트의 최대 속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_x label" @@ -479,7 +480,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "" +msgstr "X 방향 모터의 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" @@ -489,7 +490,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y description" msgid "Maximum acceleration for the motor of the Y-direction." -msgstr "" +msgstr "Y 방향 모터의 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_z label" @@ -499,7 +500,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_acceleration_z description" msgid "Maximum acceleration for the motor of the Z-direction." -msgstr "" +msgstr "Z 방향 모터의 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_e label" @@ -509,7 +510,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_acceleration_e description" msgid "Maximum acceleration for the motor of the filament." -msgstr "" +msgstr "필라멘트의 모터에 대한 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_acceleration label" @@ -519,7 +520,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_acceleration description" msgid "The default acceleration of print head movement." -msgstr "" +msgstr "프린트 헤드 이동의 기본 가속. " #: fdmprinter.def.json msgctxt "machine_max_jerk_xy label" @@ -529,7 +530,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_jerk_xy description" msgid "Default jerk for movement in the horizontal plane." -msgstr "" +msgstr "수평면에서의 이동을위한 기본 저크. " #: fdmprinter.def.json msgctxt "machine_max_jerk_z label" @@ -539,7 +540,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_jerk_z description" msgid "Default jerk for the motor of the Z-direction." -msgstr "" +msgstr "Z 방향 모터의 기본 저크. " #: fdmprinter.def.json msgctxt "machine_max_jerk_e label" @@ -549,7 +550,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_max_jerk_e description" msgid "Default jerk for the motor of the filament." -msgstr "" +msgstr "필라멘트 모터의 기본 저크. " #: fdmprinter.def.json msgctxt "machine_minimum_feedrate label" @@ -559,7 +560,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_minimum_feedrate description" msgid "The minimal movement speed of the print head." -msgstr "" +msgstr "프린트 헤드의 최소 이동 속도. " #: fdmprinter.def.json msgctxt "resolution label" @@ -569,7 +570,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "resolution description" msgid "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)" -msgstr "" +msgstr "인쇄물의 해상도에 영향을 미치는 모든 설정. 이러한 설정은 품질 (및 인쇄 시간)에 큰 영향을 미칩니다. " #: fdmprinter.def.json msgctxt "layer_height label" @@ -579,7 +580,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "layer_height description" msgid "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution." -msgstr "" +msgstr "각 층의 높이 (mm)입니다. 값이 높을수록 해상도가 낮을수록 인쇄 속도가 빨라지고 값이 낮을수록 해상도가 높을수록 인쇄 속도가 느려집니다. " #: fdmprinter.def.json msgctxt "layer_height_0 label" @@ -589,7 +590,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." -msgstr "" +msgstr "초기 레이어의 높이 (mm)입니다. 두꺼운 초기 레이어는 빌드 플레이트에 쉽게 접착합니다. " #: fdmprinter.def.json msgctxt "line_width label" @@ -599,7 +600,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "line_width description" msgid "Width of a single line. Generally, the width of each line should correspond to the width of the nozzle. However, slightly reducing this value could produce better prints." -msgstr "" +msgstr "한 줄의 너비. 일반적으로 각 라인의 너비는 노즐 폭과 일치해야합니다. 그러나이 값을 약간 줄이면 더 좋은 인 쇄를 생성 할 수 있습니다. " #: fdmprinter.def.json msgctxt "wall_line_width label" @@ -609,7 +610,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_line_width description" msgid "Width of a single wall line." -msgstr "" +msgstr "단일 벽 선의 너비입니다. " #: fdmprinter.def.json msgctxt "wall_line_width_0 label" @@ -619,7 +620,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_line_width_0 description" msgid "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed." -msgstr "" +msgstr "가장 바깥 쪽 벽 선의 너비. 이 값을 낮춤으로써 높은 수준의 디테일을 인쇄 할 수 있습니다. " #: fdmprinter.def.json msgctxt "wall_line_width_x label" @@ -629,7 +630,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." -msgstr "" +msgstr "가장 바깥 쪽 벽 선을 제외한 모든 벽 선에 대해 단일 벽 선의 폭입니다. " #: fdmprinter.def.json msgctxt "skin_line_width label" @@ -639,7 +640,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_line_width description" msgid "Width of a single top/bottom line." -msgstr "" +msgstr "단일 위쪽 / 아래쪽 선의 너비입니다. " #: fdmprinter.def.json msgctxt "infill_line_width label" @@ -649,7 +650,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_line_width description" msgid "Width of a single infill line." -msgstr "" +msgstr "단일 infill 라인의 너비. " #: fdmprinter.def.json msgctxt "skirt_brim_line_width label" @@ -659,7 +660,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_line_width description" msgid "Width of a single skirt or brim line." -msgstr "" +msgstr "단일 스커트 또는 고리 선의 너비. " #: fdmprinter.def.json msgctxt "support_line_width label" @@ -669,7 +670,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_line_width description" msgid "Width of a single support structure line." -msgstr "" +msgstr "단일 지원 구조 선의 너비입니다. " #: fdmprinter.def.json msgctxt "support_interface_line_width label" @@ -679,7 +680,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_line_width description" msgid "Width of a single line of support roof or floor." -msgstr "" +msgstr "지붕 또는 바닥을지지하는 한 줄의 폭. " #: fdmprinter.def.json msgctxt "support_roof_line_width label" @@ -689,7 +690,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_line_width description" msgid "Width of a single support roof line." -msgstr "" +msgstr "단일 지원 지붕 선의 너비. " #: fdmprinter.def.json msgctxt "support_bottom_line_width label" @@ -699,7 +700,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_line_width description" msgid "Width of a single support floor line." -msgstr "" +msgstr "단일 지원 플로어 라인의 너비. " #: fdmprinter.def.json msgctxt "prime_tower_line_width label" @@ -709,7 +710,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_line_width description" msgid "Width of a single prime tower line." -msgstr "" +msgstr "단일 주요 타워 선의 너비. " #: fdmprinter.def.json msgctxt "shell label" @@ -719,7 +720,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "shell description" msgid "Shell" -msgstr "" +msgstr "껍질 " #: fdmprinter.def.json msgctxt "wall_thickness label" @@ -729,7 +730,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_thickness description" msgid "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls." -msgstr "" +msgstr "외벽의 수평 방향의 두께. 이 값을 벽 선 너비로 나눈 값은 벽의 수를 정의합니다. " #: fdmprinter.def.json msgctxt "wall_line_count label" @@ -739,7 +740,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_line_count description" msgid "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number." -msgstr "" +msgstr "벽의 수. 벽 두께로 계산할 때이 값은 정수로 반올림됩니다. " #: fdmprinter.def.json msgctxt "wall_0_wipe_dist label" @@ -749,7 +750,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_0_wipe_dist description" msgid "Distance of a travel move inserted after the outer wall, to hide the Z seam better." -msgstr "" +msgstr "바깥 쪽 벽 뒤에 삽입 된 이동 거리. Z 솔기를 더 잘 숨 깁니다. " #: fdmprinter.def.json msgctxt "top_bottom_thickness label" @@ -759,7 +760,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "top_bottom_thickness description" msgid "The thickness of the top/bottom layers in the print. This value divided by the layer height defines the number of top/bottom layers." -msgstr "" +msgstr "인쇄물의 상단 / 하단 레이어의 두께. 이 값을 레이어 높이로 나눈 값은 위쪽 / 아래쪽 레이어의 수를 정의합니다. " #: fdmprinter.def.json msgctxt "top_thickness label" @@ -769,7 +770,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "top_thickness description" msgid "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers." -msgstr "" +msgstr "인쇄물의 상단 레이어의 두께입니다. 이 값을 레이어 높이로 나눈 값은 최상위 레이어 수를 정의합니다. " #: fdmprinter.def.json msgctxt "top_layers label" @@ -779,7 +780,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "top_layers description" msgid "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number." -msgstr "" +msgstr "인쇄물의 상단 레이어의 두께입니다. 이 값과 레이어 값을 최상위 레이어로 정의하십시오. " #: fdmprinter.def.json msgctxt "bottom_thickness label" @@ -789,7 +790,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "bottom_thickness description" msgid "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers." -msgstr "" +msgstr "인쇄물의 아래쪽 레이어의 두께입니다. 이 값을 레이어 높이로 나눈 값은 맨 아래 레이어의 수를 정의합니다. " #: fdmprinter.def.json msgctxt "bottom_layers label" @@ -799,7 +800,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "bottom_layers description" msgid "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number." -msgstr "" +msgstr "아래층의 수. 바닥 두께로 계산할 때이 값은 정수로 반올림됩니다. " #: fdmprinter.def.json msgctxt "top_bottom_pattern label" @@ -809,7 +810,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "top_bottom_pattern description" msgid "The pattern of the top/bottom layers." -msgstr "" +msgstr "상단 / 하단 레이어의 패턴. " #: fdmprinter.def.json msgctxt "top_bottom_pattern option lines" @@ -834,7 +835,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 description" msgid "The pattern on the bottom of the print on the first layer." -msgstr "" +msgstr "첫 번째 레이어의 인쇄 아래쪽에있는 패턴입니다. " #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option lines" @@ -859,7 +860,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_angles description" msgid "A list of integer line directions to use when the top/bottom layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees)." -msgstr "" +msgstr "상단 / 하단 레이어가 선 또는 지그재그 패턴을 사용할 때 사용할 정수선 방향 목록입니다. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호 안에 들어 있습니다. 기본값은 전통적인 기본 각도 (45도 및 135도)를 사용하는 빈 목록입니다. " #: fdmprinter.def.json msgctxt "wall_0_inset label" @@ -869,7 +870,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_0_inset description" msgid "Inset applied to the path of the outer wall. If the outer wall is smaller than the nozzle, and printed after the inner walls, use this offset to get the hole in the nozzle to overlap with the inner walls instead of the outside of the model." -msgstr "" +msgstr "외벽의 경로에 삽입이 적용됩니다. 외벽이 노즐보다 작고 내벽 다음에 인쇄 된 경우이 옵셋을 사용하여 노즐의 구멍이 모델 외부가 아닌 내벽과 겹치도록하십시오. " #: fdmprinter.def.json msgctxt "outer_inset_first label" @@ -879,7 +880,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "outer_inset_first description" msgid "Prints walls in order of outside to inside when enabled. This can help improve dimensional accuracy in X and Y when using a high viscosity plastic like ABS; however it can decrease outer surface print quality, especially on overhangs." -msgstr "" +msgstr "사용 가능한 경우 외부에서 내부로 벽을 인쇄합니다. 이것은 ABS와 같은 고점도 플라스틱을 사용할 때 X와 Y의 치수 정확도를 향상시키는 데 도움이됩니다. 그러나 외 표면 인쇄 품질을 떨어 뜨릴 수 있습니다 (특히 오버행시). " #: fdmprinter.def.json msgctxt "alternate_extra_perimeter label" @@ -889,7 +890,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "alternate_extra_perimeter description" msgid "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints." -msgstr "" +msgstr "다른 모든 레이어에 여분의 벽을 인쇄합니다. 이렇게하면 충전물이이 여분의 벽 사이에 끼어 더 강하게 인쇄됩니다. " #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled label" @@ -899,7 +900,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled description" msgid "Compensate the flow for parts of a wall being printed where there is already a wall in place." -msgstr "" +msgstr "이미 벽이있는 곳에 인쇄중인 벽의 부분에 대한 흐름을 보정하십시오. " #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled label" @@ -909,7 +910,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled description" msgid "Compensate the flow for parts of an outer wall being printed where there is already a wall in place." -msgstr "" +msgstr "이미 벽이있는 곳에 인쇄되는 외벽 부분에 대한 흐름을 보정합니다. " #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled label" @@ -919,7 +920,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled description" msgid "Compensate the flow for parts of an inner wall being printed where there is already a wall in place." -msgstr "" +msgstr "이미 벽이있는 곳에 인쇄되는 내부 벽 부분에 대한 흐름을 보정하십시오. " #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -929,7 +930,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps description" msgid "Fills the gaps between walls where no walls fit." -msgstr "" +msgstr "벽이 딱 맞지 않는 벽 사이의 간격을 채 웁니다. " #: fdmprinter.def.json msgctxt "fill_perimeter_gaps option nowhere" @@ -949,7 +950,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "xy_offset description" msgid "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes." -msgstr "" +msgstr "각 레이어의 모든 다각형에 적용된 오프셋의 양입니다. 양수 값은 너무 큰 구멍을 보완 할 수 있습니다. 음수 값은 너무 작은 구멍을 보완 할 수 있습니다. " #: fdmprinter.def.json msgctxt "z_seam_type label" @@ -959,7 +960,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "z_seam_type description" msgid "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these near a user specified location, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker." -msgstr "" +msgstr "레이어의 각 패스의 시작점입니다. 연속 레이어의 패스가 같은 지점에서 시작되면 세로 솔기가 인쇄물에 표시 될 수 있습니다. 사용자 지정 위치 근처에서 이들을 정렬 할 때 이음선을 제거하는 것이 가장 쉽습니다. 무작위로 배치 될 때 경로 시작시 부정확성은 눈에 띄지 않습니다. 최단 경로를 취할 때 인쇄가 빨라집니다. " #: fdmprinter.def.json msgctxt "z_seam_type option back" @@ -984,7 +985,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "z_seam_x description" msgid "The X coordinate of the position near where to start printing each part in a layer." -msgstr "" +msgstr "레이어의 각 파트 인쇄를 시작할 위치 근처의 X 좌표입니다. " #: fdmprinter.def.json msgctxt "z_seam_y label" @@ -994,7 +995,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "z_seam_y description" msgid "The Y coordinate of the position near where to start printing each part in a layer." -msgstr "" +msgstr "레이어의 각 부분을 인쇄 할 위치 근처의 위치에 대한 Y 좌표입니다. " #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic label" @@ -1004,7 +1005,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic description" msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting." -msgstr "" +msgstr "모델에 수직 간격이 작 으면이 좁은 공간에서 상단 및 하단 스킨을 생성하는 데 약 5 %의 추가 계산 시간을 소비 할 수 있습니다. 이 경우 설정을 해제하십시오. " #: fdmprinter.def.json msgctxt "infill label" @@ -1014,7 +1015,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill description" msgid "Infill" -msgstr "" +msgstr "충진 " #: fdmprinter.def.json msgctxt "infill_sparse_density label" @@ -1024,7 +1025,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "" +msgstr "인쇄물의 충진율를 조절합니다." #: fdmprinter.def.json msgctxt "infill_line_distance label" @@ -1034,7 +1035,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_line_distance description" msgid "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width." -msgstr "" +msgstr "인쇄 된 충진 선 사이의 거리. 이 설정은 충전 밀도 및 충전 선 너비로 계산됩니다. " #: fdmprinter.def.json msgctxt "infill_pattern label" @@ -1044,7 +1045,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "프린트의 충전재 패턴. 라인과 지그는 대체 층에서 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 사면체 및 동심원 패턴은 모든 레이어에 완전히 인쇄됩니다. 입방체 및 사면체 충전재는 각 방향마다 강도가 균등하게 분포되도록 모든 층을 변경합니다. " #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1099,7 +1100,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." -msgstr "" +msgstr "사용할 정수선 방향 목록. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호 안에 들어 있습니다. 기본값은 전통적인 기본 각도 (선 및 지그재그 패턴의 경우 45 및 135도, 다른 모든 패턴의 경우 45도)를 사용한다는 의미의 빈 목록입니다. " #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" @@ -1109,7 +1110,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled description" msgid "Print the infill every so often, so that the filament will curl up chaotically inside the object. This reduces print time, but the behaviour is rather unpredictable." -msgstr "" +msgstr "필라멘트가 물체 내부에서 혼란스럽게 뒤 틀릴 수 있도록 필러를 너무 자주 인쇄하십시오. 이렇게하면 인쇄 시간이 줄어들지 만 예측할 수없는 행동입니다. " #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle label" @@ -1119,7 +1120,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle description" msgid "The maximum angle w.r.t. the Z axis of the inside of the print for areas which are to be filled with spaghetti infill afterwards. Lowering this value causes more angled parts in your model to be filled on each layer." -msgstr "" +msgstr "최대 각도 w.r.t. 나중에 스파게티가 채워질 영역에 대한 인쇄 내부의 Z 축. 이 값을 낮추면 모델의 각진 부분이 각 레이어에 채워집니다. " #: fdmprinter.def.json msgctxt "spaghetti_max_height label" @@ -1129,7 +1130,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_max_height description" msgid "The maximum height of inside space which can be combined and filled from the top." -msgstr "" +msgstr "상단에서 결합하여 채울 수있는 내부 공간의 최대 높이입니다. " #: fdmprinter.def.json msgctxt "spaghetti_inset label" @@ -1139,7 +1140,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_inset description" msgid "The offset from the walls from where the spaghetti infill will be printed." -msgstr "" +msgstr "스파게티가 채워지는 벽의 오프셋. " #: fdmprinter.def.json msgctxt "spaghetti_flow label" @@ -1149,7 +1150,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "spaghetti_flow description" msgid "Adjusts the density of the spaghetti infill. Note that the Infill Density only controls the line spacing of the filling pattern, not the amount of extrusion for spaghetti infill." -msgstr "" +msgstr "스파게티 주입 물의 밀도를 조정합니다. Infill Density는 스파게티 필링의 돌출 량이 아니라 채우기 패턴의 줄 간격 만 제어합니다. " #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1159,7 +1160,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add description" msgid "An addition to the radius from the center of each cube to check for the boundary of the model, as to decide whether this cube should be subdivided. Larger values lead to a thicker shell of small cubes near the boundary of the model." -msgstr "" +msgstr "모델의 경계를 확인하기 위해 각 큐브의 중심에서 반경을 더하여이 큐브를 세분화할지 여부를 결정합니다. 값이 클수록 모델의 경계 근처에 작은 큐브가 더 두껍게 나옵니다. " #: fdmprinter.def.json msgctxt "infill_overlap label" @@ -1169,7 +1170,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "충진재와 벽 사이의 겹침 정도. 약간 겹치면 벽이 충전재에 단단히 연결됩니다." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1179,7 +1180,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm description" msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "충진재와 벽 사이의 겹침 정도. 약간 겹치면 벽이 충전재에 단단히 연결됩니다. " #: fdmprinter.def.json msgctxt "skin_overlap label" @@ -1189,7 +1190,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin." -msgstr "" +msgstr "피부와 벽 사이의 겹침 정도입니다. 약간 겹치면 벽이 피부에 단단히 연결됩니다. " #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1199,7 +1200,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm description" msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin." -msgstr "" +msgstr "피부와 벽 사이의 겹침 정도입니다. 약간 겹치면 벽이 피부에 단단히 연결됩니다. " #: fdmprinter.def.json msgctxt "infill_wipe_dist label" @@ -1209,7 +1210,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_wipe_dist description" msgid "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line." -msgstr "" +msgstr "각 충진 라인 다음에 삽입 된 이동 이동 거리. infill 스틱을 벽에 더 잘 붙이게합니다. 이 옵션은 충전재 겹침과 유사하지만 압출이없고 충전 선의 한쪽 끝에서만 사용됩니다." #: fdmprinter.def.json msgctxt "infill_sparse_thickness label" @@ -1219,7 +1220,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_sparse_thickness description" msgid "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded." -msgstr "" +msgstr "충진물 층의 두께. 이 값은 항상 레이어 높이의 배수 여야하며 반올림됩니다. " #: fdmprinter.def.json msgctxt "gradual_infill_steps label" @@ -1229,7 +1230,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "gradual_infill_steps description" msgid "Number of times to reduce the infill density by half when getting further below top surfaces. Areas which are closer to top surfaces get a higher density, up to the Infill Density." -msgstr "" +msgstr "상면 아래로 갈 때 충진 밀도를 반으로 줄이는 횟수입니다. 상단면에 더 가까운 영역은 충진율 농도가 더 높은 밀도를 갖습니다. " #: fdmprinter.def.json msgctxt "gradual_infill_step_height label" @@ -1239,7 +1240,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "gradual_infill_step_height description" msgid "The height of infill of a given density before switching to half the density." -msgstr "" +msgstr "밀도의 절반으로 전환하기 전에 주어진 밀도의 infill 높이. " #: fdmprinter.def.json msgctxt "infill_before_walls label" @@ -1249,7 +1250,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_before_walls description" msgid "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface." -msgstr "" +msgstr "벽을 인쇄하기 전에 충진물을 인쇄하십시오. 벽을 먼저 인쇄하면 벽이 더 정확해질 수 있지만 돌출이 더 많이 인쇄됩니다. 충진재를 먼저 인쇄하면 더 튼튼한 벽이 생기지 만 충전물 패턴이 때로 표면을 통해 보일 수 있습니다. " #: fdmprinter.def.json msgctxt "min_infill_area label" @@ -1259,7 +1260,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "min_infill_area description" msgid "Don't generate areas of infill smaller than this (use skin instead)." -msgstr "" +msgstr "이보다 작은 충진물 영역을 생성하지 마십시오 (대신 스킨 사용). " #: fdmprinter.def.json msgctxt "expand_skins_into_infill label" @@ -1269,7 +1270,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "expand_skins_into_infill description" msgid "Expand skin areas of top and/or bottom skin of flat surfaces. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the infill on the next layer rests on skin." -msgstr "" +msgstr "평면의 상단 및 / 또는 하단 스킨 영역을 확장합니다. 기본적으로 스필은 충진을 둘러싸는 벽 선 아래에서 멈 춥니 다. 그러나 이는 충진 밀도가 낮을 때 나타나는 구멍으로 이어질 수 있습니다. 이 설정은 스킨을 벽 선 너머로 확장하여 다음 레이어의 필이 피부에 놓 이도록합니다. " #: fdmprinter.def.json msgctxt "expand_upper_skins label" @@ -1279,7 +1280,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "expand_upper_skins description" msgid "Expand the top skin areas (areas with air above) so that they support infill above." -msgstr "" +msgstr "상단 피부 영역 (위의 공기가있는 영역)을 확장하여 위의 충진물을 지탱하도록하십시오. " #: fdmprinter.def.json msgctxt "expand_lower_skins label" @@ -1289,7 +1290,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "expand_lower_skins description" msgid "Expand the bottom skin areas (areas with air below) so that they are anchored by the infill layers above and below." -msgstr "" +msgstr "아래 피부 영역 (공기가있는 부분)을 확장하여 위와 아래의 충진층으로 고정시킵니다. " #: fdmprinter.def.json msgctxt "expand_skins_expand_distance label" @@ -1299,7 +1300,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance description" msgid "The distance the skins are expanded into the infill. The default distance is enough to bridge the gap between the infill lines and will stop holes appearing in the skin where it meets the wall when the infill density is low. A smaller distance will often be sufficient." -msgstr "" +msgstr "스킨이 충진 될 거리입니다. 기본 거리는 충진 선 사이의 간격을 메우기에 충분하며 충진 밀도가 낮을 때 벽과 만나는 스킨에 나타나는 구멍을 막습니다. 거리가 짧으면 충분합니다. " #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion label" @@ -1309,7 +1310,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion description" msgid "Top and/or bottom surfaces of your object with an angle larger than this setting, won't have their top/bottom skin expanded. This avoids expanding the narrow skin areas that are created when the model surface has a near vertical slope. An angle of 0° is horizontal, while an angle of 90° is vertical." -msgstr "" +msgstr "이 설정보다 큰 각도로 객체의 상단 및 / 또는 하단 표면은 위쪽 / 아래쪽 스킨이 확장되지 않습니다. 이렇게하면 모델 표면이 수직 경사가 거의 없을 때 생성되는 좁은 스킨 영역을 확장하지 않아도됩니다. \"0\" 도의 각도는 수평이며, 90 도의 각도는 수직입니다. " #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion label" @@ -1319,17 +1320,17 @@ msgstr "" #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion description" msgid "Skin areas narrower than this are not expanded. This avoids expanding the narrow skin areas that are created when the model surface has a slope close to the vertical." -msgstr "" +msgstr "이보다 좁은 스킨 영역은 확장되지 않습니다. 이렇게하면 모델 표면이 수직에 가까운 기울기를 가질 때 생성되는 좁은 스킨 영역을 확장하지 않아도됩니다. " #: fdmprinter.def.json msgctxt "material label" msgid "Material" -msgstr "" +msgstr "재료 " #: fdmprinter.def.json msgctxt "material description" msgid "Material" -msgstr "" +msgstr "재료 " #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -1339,7 +1340,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature description" msgid "Change the temperature for each layer automatically with the average flow speed of that layer." -msgstr "" +msgstr "해당 레이어의 평균 유속으로 각 레이어의 온도를 자동으로 변경하십시오. " #: fdmprinter.def.json msgctxt "default_material_print_temperature label" @@ -1349,7 +1350,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value" -msgstr "" +msgstr "인쇄에 사용되는 기본 온도입니다. 이것은 재료의 \"기본\"온도 여야합니다. 다른 모든 인쇄 온도는이 값을 기준으로 오프셋을 사용해야합니다. " #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1359,7 +1360,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_print_temperature description" msgid "The temperature used for printing." -msgstr "" +msgstr "인쇄에 사용되는 온도. " #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 label" @@ -1369,7 +1370,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 description" msgid "The temperature used for printing the first layer. Set at 0 to disable special handling of the initial layer." -msgstr "" +msgstr "첫 번째 레이어 인쇄에 사용되는 온도입니다. 초기 레이어의 특수 처리를 사용하지 않으려면 \"0\"으로 설정합니다. " #: fdmprinter.def.json msgctxt "material_initial_print_temperature label" @@ -1379,7 +1380,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_initial_print_temperature description" msgid "The minimal temperature while heating up to the Printing Temperature at which printing can already start." -msgstr "" +msgstr "인쇄가 이미 시작될 수있는 인쇄 온도까지 가열하는 동안 최소 온도. " #: fdmprinter.def.json msgctxt "material_final_print_temperature label" @@ -1389,7 +1390,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." -msgstr "" +msgstr "인쇄 종료 직전에 이미 냉각이 시작될 온도입니다. " #: fdmprinter.def.json msgctxt "material_flow_temp_graph label" @@ -1399,7 +1400,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_flow_temp_graph description" msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "" +msgstr "데이터 흐름 (mm3 / 초) - 온도 (섭씨). " #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" @@ -1409,7 +1410,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed description" msgid "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding." -msgstr "" +msgstr "압출하는 동안 노즐이 냉각되는 추가 속도. 압출하는 동안 가열 될 때 상실되는 열 상승 속도를 나타 내기 위해 동일한 값이 사용됩니다. " #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -1419,7 +1420,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed will not heat up for this print." -msgstr "" +msgstr "가열 된 빌드 플레이트에 사용되는 온도. 이 값이 0이면이 인쇄물에 침대가 가열되지 않습니다. " #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -1429,7 +1430,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 description" msgid "The temperature used for the heated build plate at the first layer." -msgstr "" +msgstr "첫 번째 레이어에서 가열 된 빌드 플레이트에 사용되는 온도. " #: fdmprinter.def.json msgctxt "material_diameter label" @@ -1439,7 +1440,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." -msgstr "" +msgstr "사용 된 필라멘트의 직경을 조정합니다. 이 값을 사용 필라멘트의 직경과 일치시킵니다. " #: fdmprinter.def.json msgctxt "material_flow label" @@ -1449,7 +1450,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_flow description" msgid "Flow compensation: the amount of material extruded is multiplied by this value." -msgstr "" +msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. " #: fdmprinter.def.json msgctxt "retraction_enable label" @@ -1459,7 +1460,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_enable description" msgid "Retract the filament when the nozzle is moving over a non-printed area. " -msgstr "" +msgstr "노즐이 인쇄되지 않은 영역 위로 움직일 때 필라멘트를 잡아 당깁니다. " #: fdmprinter.def.json msgctxt "retract_at_layer_change label" @@ -1469,7 +1470,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retract_at_layer_change description" msgid "Retract the filament when the nozzle is moving to the next layer." -msgstr "" +msgstr "노즐이 다음 층으로 이동할 때 필라멘트를 후퇴시킵니다. " #: fdmprinter.def.json msgctxt "retraction_amount label" @@ -1479,7 +1480,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_amount description" msgid "The length of material retracted during a retraction move." -msgstr "" +msgstr "후퇴 이동 중에 수축 된 재료의 길이입니다. " #: fdmprinter.def.json msgctxt "retraction_speed label" @@ -1489,7 +1490,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_speed description" msgid "The speed at which the filament is retracted and primed during a retraction move." -msgstr "" +msgstr "후퇴 이동 중에 필라멘트가 수축되고 프라이밍되는 속도입니다. " #: fdmprinter.def.json msgctxt "retraction_retract_speed label" @@ -1499,7 +1500,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_retract_speed description" msgid "The speed at which the filament is retracted during a retraction move." -msgstr "" +msgstr "후퇴 이동 중에 필라멘트가 후퇴하는 속도입니다. " #: fdmprinter.def.json msgctxt "retraction_prime_speed label" @@ -1509,7 +1510,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_prime_speed description" msgid "The speed at which the filament is primed during a retraction move." -msgstr "" +msgstr "후퇴 이동 중에 필라멘트가 프라이밍되는 속도입니다. " #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount label" @@ -1519,7 +1520,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount description" msgid "Some material can ooze away during a travel move, which can be compensated for here." -msgstr "" +msgstr "여행 중에 이동할 수있는 물질이 있습니다.이 물질은 여기에서 보상받을 수 있습니다. " #: fdmprinter.def.json msgctxt "retraction_min_travel label" @@ -1529,7 +1530,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_min_travel description" msgid "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area." -msgstr "" +msgstr "수축이 일어나기 위해 필요한 최소한의 이동 거리. 이렇게하면 작은 영역에서 더 적은 수축을 얻을 수 있습니다. " #: fdmprinter.def.json msgctxt "retraction_count_max label" @@ -1539,7 +1540,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_count_max description" msgid "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues." -msgstr "" +msgstr "이 설정은 최소 돌출 거리 창 내에서 발생하는 후퇴 수를 제한합니다. 이 창 내에서 더 이상의 철회는 무시됩니다. 이렇게하면 필라멘트를 평평하게하고 연삭 문제를 일으킬 수 있으므로 동일한 필라멘트에서 반복적으로 후퇴하지 않습니다. " #: fdmprinter.def.json msgctxt "retraction_extrusion_window label" @@ -1549,7 +1550,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_extrusion_window description" msgid "The window in which the maximum retraction count is enforced. This value should be approximately the same as the retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited." -msgstr "" +msgstr "최대 후퇴 횟수가 시행되는 창입니다. 이 값은 수축 거리와 거의 같아야하므로 같은 수축 패치가 통과하는 횟수가 효과적으로 제한됩니다. " #: fdmprinter.def.json msgctxt "material_standby_temperature label" @@ -1559,7 +1560,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "material_standby_temperature description" msgid "The temperature of the nozzle when another nozzle is currently used for printing." -msgstr "" +msgstr "다른 노즐이 현재 인쇄에 사용되는 경우의 노즐 온도. " #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount label" @@ -1569,7 +1570,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount description" msgid "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone." -msgstr "" +msgstr "수축 양 : 수축이 전혀없는 경우 0으로 설정합니다. 일반적으로 열 영역의 길이와 같아야합니다. " #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds label" @@ -1579,7 +1580,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds description" msgid "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding." -msgstr "" +msgstr "필라멘트가 수축되는 속도입니다. 후퇴 속도가 빠르면 빠르지 만 후퇴 속도가 높으면 필라멘트 연삭으로 이어질 수 있습니다. " #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed label" @@ -1589,7 +1590,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed description" msgid "The speed at which the filament is retracted during a nozzle switch retract." -msgstr "" +msgstr "노즐 스위치가 들어갈 때 필라멘트가 후퇴하는 속도. " #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed label" @@ -1599,7 +1600,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed description" msgid "The speed at which the filament is pushed back after a nozzle switch retraction." -msgstr "" +msgstr "노즐 스위치 수축 후 필라멘트가 뒤로 밀리는 속도. " #: fdmprinter.def.json msgctxt "speed label" @@ -1609,7 +1610,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed description" msgid "Speed" -msgstr "" +msgstr "속도 " #: fdmprinter.def.json msgctxt "speed_print label" @@ -1619,7 +1620,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_print description" msgid "The speed at which printing happens." -msgstr "" +msgstr "인쇄 속도. " #: fdmprinter.def.json msgctxt "speed_infill label" @@ -1629,7 +1630,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_infill description" msgid "The speed at which infill is printed." -msgstr "" +msgstr "충진물이 인쇄되는 속도. " #: fdmprinter.def.json msgctxt "speed_wall label" @@ -1639,7 +1640,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_wall description" msgid "The speed at which the walls are printed." -msgstr "" +msgstr "벽이 인쇄되는 속도입니다. " #: fdmprinter.def.json msgctxt "speed_wall_0 label" @@ -1649,7 +1650,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_wall_0 description" msgid "The speed at which the outermost walls are printed. Printing the outer wall at a lower speed improves the final skin quality. However, having a large difference between the inner wall speed and the outer wall speed will affect quality in a negative way." -msgstr "" +msgstr "가장 바깥 쪽 벽이 인쇄되는 속도입니다. 외벽을 더 낮은 속도로 인쇄하면 최종 피부 품질이 향상됩니다. 그러나 내벽 속도와 외벽 속도 사이에 큰 차이가있을 경우 부정적인 방식으로 품질에 영향을 미칩니다. " #: fdmprinter.def.json msgctxt "speed_wall_x label" @@ -1659,7 +1660,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_wall_x description" msgid "The speed at which all inner walls are printed. Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed." -msgstr "" +msgstr "모든 내부 벽이 인쇄되는 속도입니다. 내벽을 외벽보다 빠르게 인쇄하면 인쇄 시간이 단축됩니다. 외벽 속도와 충전 속도 사이에서 이것을 설정하는 것이 효과적입니다. " #: fdmprinter.def.json msgctxt "speed_topbottom label" @@ -1669,7 +1670,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_topbottom description" msgid "The speed at which top/bottom layers are printed." -msgstr "" +msgstr "위쪽 / 아래쪽 레이어가 인쇄되는 속도입니다. " #: fdmprinter.def.json msgctxt "speed_support label" @@ -1679,7 +1680,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support description" msgid "The speed at which the support structure is printed. Printing support at higher speeds can greatly reduce printing time. The surface quality of the support structure is not important since it is removed after printing." -msgstr "" +msgstr "지지 구조가 인쇄되는 속도입니다. 고속 인쇄 지원은 인쇄 시간을 크게 단축시킵니다. 지지 구조체의 표면 품질은 인쇄 후에 제거되므로 중요하지 않습니다. " #: fdmprinter.def.json msgctxt "speed_support_infill label" @@ -1689,7 +1690,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_infill description" msgid "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability." -msgstr "" +msgstr "지지대의 충전물이 인쇄되는 속도. infill을 저속으로 인쇄하면 안정성이 향상됩니다. " #: fdmprinter.def.json msgctxt "speed_support_interface label" @@ -1699,7 +1700,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_interface description" msgid "The speed at which the roofs and floors of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "" +msgstr "지지대의 지붕과 바닥이 인쇄되는 속도. 인쇄 속도를 느리게하면 돌출 품질이 향상 될 수 있습니다. " #: fdmprinter.def.json msgctxt "speed_support_roof label" @@ -1709,7 +1710,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_roof description" msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "" +msgstr "지지대의 지붕이 인쇄되는 속도입니다. 인쇄 속도를 느리게하면 돌출 품질이 향상 될 수 있습니다. " #: fdmprinter.def.json msgctxt "speed_support_bottom label" @@ -1719,7 +1720,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_bottom description" msgid "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model." -msgstr "" +msgstr "지지대 바닥 인쇄 속도. 더 낮은 속도로 인쇄하면 모델 상단의 지지력이 향상됩니다. " #: fdmprinter.def.json msgctxt "speed_prime_tower label" @@ -1729,7 +1730,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_prime_tower description" msgid "The speed at which the prime tower is printed. Printing the prime tower slower can make it more stable when the adhesion between the different filaments is suboptimal." -msgstr "" +msgstr "프라임 타워가 인쇄되는 속도. 프라임 타워를 더 천천히 인쇄하면 다른 필라멘트 사이의 접착력이 차선적일 때보다 안정적으로 만들 수 있습니다. " #: fdmprinter.def.json msgctxt "speed_travel label" @@ -1739,7 +1740,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_travel description" msgid "The speed at which travel moves are made." -msgstr "" +msgstr "움직일때의 이동 속도." #: fdmprinter.def.json msgctxt "speed_layer_0 label" @@ -1749,7 +1750,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_layer_0 description" msgid "The speed for the initial layer. A lower value is advised to improve adhesion to the build plate." -msgstr "" +msgstr "초기 레이어의 속도입니다. 빌드 플레이트에 대한 접착력을 향상 시키려면 낮은 값을 권합니다. " #: fdmprinter.def.json msgctxt "speed_print_layer_0 label" @@ -1759,7 +1760,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_print_layer_0 description" msgid "The speed of printing for the initial layer. A lower value is advised to improve adhesion to the build plate." -msgstr "" +msgstr "초기 레이어의 인쇄 속도입니다. 빌드 플레이트에 대한 접착력을 향상 시키려면 낮은 값을 권합니다. " #: fdmprinter.def.json msgctxt "speed_travel_layer_0 label" @@ -1769,7 +1770,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_travel_layer_0 description" msgid "The speed of travel moves in the initial layer. A lower value is advised to prevent pulling previously printed parts away from the build plate. The value of this setting can automatically be calculated from the ratio between the Travel Speed and the Print Speed." -msgstr "" +msgstr "이동 속도는 초기 레이어에서 이동합니다. 이전에 인쇄 된 부품을 빌드 플레이트에서 빼내는 것을 방지하려면 더 낮은 값을 권합니다. 이 설정의 값은 이동 속도와 인쇄 속도 사이의 비율로부터 자동으로 계산 될 수 있습니다. " #: fdmprinter.def.json msgctxt "skirt_brim_speed label" @@ -1779,7 +1780,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_speed description" msgid "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt or brim at a different speed." -msgstr "" +msgstr "스커트와 가장자리가 인쇄되는 속도입니다. 일반적으로 이것은 초기 레이어 속도에서 수행되지만 때로는 스커트 나 가장자리를 다른 속도로 인쇄하려고 할 수 있습니다. " #: fdmprinter.def.json msgctxt "max_feedrate_z_override label" @@ -1789,7 +1790,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "max_feedrate_z_override description" msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed." -msgstr "" +msgstr "빌드 플레이트가 움직이는 최대 속도. 이 값을 0으로 설정하면 인쇄시 최대 z 속도의 펌웨어 기본값이 사용됩니다. " #: fdmprinter.def.json msgctxt "speed_slowdown_layers label" @@ -1799,7 +1800,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_slowdown_layers description" msgid "The first few layers are printed slower than the rest of the model, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers." -msgstr "" +msgstr "처음 몇 개의 레이어는 모델의 나머지 부분보다 느리게 인쇄되어 빌드 플레이트에 대한보다 나은 접착력을 얻고 인쇄물의 전체 성공률을 향상시킵니다. 속도는이 층 위로 점진적으로 증가합니다. " #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled label" @@ -1809,7 +1810,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled description" msgid "Print thinner than normal lines faster so that the amount of material extruded per second remains the same. Thin pieces in your model might require lines printed with smaller line width than provided in the settings. This setting controls the speed changes for such lines." -msgstr "" +msgstr "일반 라인보다 얇게 인쇄하여 초당 압출되는 재료의 양이 동일하게 유지되도록하십시오. 모델의 얇은 부분에는 설정에서 제공 한 것보다 작은 선 너비로 선이 인쇄되어야 할 수 있습니다. 이 설정은 이러한 선의 속도 변경을 제어합니다. " #: fdmprinter.def.json msgctxt "speed_equalize_flow_max label" @@ -1819,7 +1820,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_equalize_flow_max description" msgid "Maximum print speed when adjusting the print speed in order to equalize flow." -msgstr "" +msgstr "인쇄 속도를 조정할 때 최대 인쇄 속도로 흐름을 균등하게 유지합니다. " #: fdmprinter.def.json msgctxt "acceleration_enabled label" @@ -1829,7 +1830,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_enabled description" msgid "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality." -msgstr "" +msgstr "프린트 헤드 가속도를 조정할 수 있습니다. 가속도를 높이면 인쇄 품질을 저하시키면서 인쇄 시간을 줄일 수 있습니다. " #: fdmprinter.def.json msgctxt "acceleration_print label" @@ -1839,7 +1840,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_print description" msgid "The acceleration with which printing happens." -msgstr "" +msgstr "인쇄 속도가 빨라집니다. " #: fdmprinter.def.json msgctxt "acceleration_infill label" @@ -1849,7 +1850,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_infill description" msgid "The acceleration with which infill is printed." -msgstr "" +msgstr "충진물이 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_wall label" @@ -1859,7 +1860,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_wall description" msgid "The acceleration with which the walls are printed." -msgstr "" +msgstr "벽이 가속되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_wall_0 label" @@ -1869,7 +1870,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_wall_0 description" msgid "The acceleration with which the outermost walls are printed." -msgstr "" +msgstr "가장 바깥 쪽 벽이 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_wall_x label" @@ -1879,7 +1880,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_wall_x description" msgid "The acceleration with which all inner walls are printed." -msgstr "" +msgstr "모든 내부 벽이 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_topbottom label" @@ -1889,7 +1890,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_topbottom description" msgid "The acceleration with which top/bottom layers are printed." -msgstr "" +msgstr "위쪽 / 아래쪽 레이어가 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_support label" @@ -1899,7 +1900,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support description" msgid "The acceleration with which the support structure is printed." -msgstr "" +msgstr "지지 구조가 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_support_infill label" @@ -1909,7 +1910,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_infill description" msgid "The acceleration with which the infill of support is printed." -msgstr "" +msgstr "지지대의 충전물이 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_support_interface label" @@ -1919,7 +1920,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_interface description" msgid "The acceleration with which the roofs and floors of support are printed. Printing them at lower acceleration can improve overhang quality." -msgstr "" +msgstr "지지대의 지붕과 바닥이 인쇄되는 가속도. 낮은 가속도로 인쇄하면 돌출 품질이 향상 될 수 있습니다. " #: fdmprinter.def.json msgctxt "acceleration_support_roof label" @@ -1929,7 +1930,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_roof description" msgid "The acceleration with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality." -msgstr "" +msgstr "지지대의 지붕이 인쇄되는 가속도. 낮은 가속도로 인쇄하면 돌출 품질이 향상 될 수 있습니다. " #: fdmprinter.def.json msgctxt "acceleration_support_bottom label" @@ -1939,7 +1940,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_bottom description" msgid "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model." -msgstr "" +msgstr "지면의 가속도가 인쇄됩니다. 보다 낮은 가속도로 인쇄하면 모델 상단에 지지력을 향상시킬 수 있습니다. " #: fdmprinter.def.json msgctxt "acceleration_prime_tower label" @@ -1949,7 +1950,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_prime_tower description" msgid "The acceleration with which the prime tower is printed." -msgstr "" +msgstr "프라임 타워가 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_travel label" @@ -1959,7 +1960,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_travel description" msgid "The acceleration with which travel moves are made." -msgstr "" +msgstr "여행이 움직이는 가속도가 만들어집니다. " #: fdmprinter.def.json msgctxt "acceleration_layer_0 label" @@ -1969,7 +1970,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_layer_0 description" msgid "The acceleration for the initial layer." -msgstr "" +msgstr "초기 레이어의 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_print_layer_0 label" @@ -1979,7 +1980,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_print_layer_0 description" msgid "The acceleration during the printing of the initial layer." -msgstr "" +msgstr "초기 레이어 인쇄 중 가속도. " #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 label" @@ -1989,7 +1990,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 description" msgid "The acceleration for travel moves in the initial layer." -msgstr "" +msgstr "이동 가속도는 초기 레이어에서 이동합니다. " #: fdmprinter.def.json msgctxt "acceleration_skirt_brim label" @@ -1999,7 +2000,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_skirt_brim description" msgid "The acceleration with which the skirt and brim are printed. Normally this is done with the initial layer acceleration, but sometimes you might want to print the skirt or brim at a different acceleration." -msgstr "" +msgstr "치마와 가장자리가 인쇄되는 가속도. 일반적으로 이것은 초기 레이어 가속으로 이루어 지지만 때로는 스커트 나 테두리를 다른 가속으로 인쇄하려고 할 수 있습니다. " #: fdmprinter.def.json msgctxt "jerk_enabled label" @@ -2009,7 +2010,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_enabled description" msgid "Enables adjusting the jerk of print head when the velocity in the X or Y axis changes. Increasing the jerk can reduce printing time at the cost of print quality." -msgstr "" +msgstr "X 또는 Y 축의 속도가 변경 될 때 프린트 헤드의 속도를 조정할 수 있습니다. 저크를 높이면 인쇄 품질을 저하시키면서 인쇄 시간을 줄일 수 있습니다. " #: fdmprinter.def.json msgctxt "jerk_print label" @@ -2019,7 +2020,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_print description" msgid "The maximum instantaneous velocity change of the print head." -msgstr "" +msgstr "프린트 헤드의 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_infill label" @@ -2029,7 +2030,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_infill description" msgid "The maximum instantaneous velocity change with which infill is printed." -msgstr "" +msgstr "충진물이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_wall label" @@ -2039,7 +2040,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_wall description" msgid "The maximum instantaneous velocity change with which the walls are printed." -msgstr "" +msgstr "벽이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_wall_0 label" @@ -2049,7 +2050,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_wall_0 description" msgid "The maximum instantaneous velocity change with which the outermost walls are printed." -msgstr "" +msgstr "가장 바깥 쪽 벽이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_wall_x label" @@ -2059,7 +2060,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_wall_x description" msgid "The maximum instantaneous velocity change with which all inner walls are printed." -msgstr "" +msgstr "모든 내부 벽이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_topbottom label" @@ -2069,7 +2070,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_topbottom description" msgid "The maximum instantaneous velocity change with which top/bottom layers are printed." -msgstr "" +msgstr "상단 / 하단 레이어가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support label" @@ -2079,7 +2080,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support description" msgid "The maximum instantaneous velocity change with which the support structure is printed." -msgstr "" +msgstr "지지 구조가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_infill label" @@ -2089,7 +2090,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_infill description" msgid "The maximum instantaneous velocity change with which the infill of support is printed." -msgstr "" +msgstr "지지대가 채워지는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_interface label" @@ -2099,7 +2100,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_interface description" msgid "The maximum instantaneous velocity change with which the roofs and floors of support are printed." -msgstr "" +msgstr "지지대의 지붕과 바닥이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_roof label" @@ -2109,7 +2110,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_roof description" msgid "The maximum instantaneous velocity change with which the roofs of support are printed." -msgstr "" +msgstr "지지대의 지붕이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_bottom label" @@ -2119,7 +2120,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" msgid "The maximum instantaneous velocity change with which the floors of support are printed." -msgstr "" +msgstr "지지대의 바닥이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_prime_tower label" @@ -2129,7 +2130,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_prime_tower description" msgid "The maximum instantaneous velocity change with which the prime tower is printed." -msgstr "" +msgstr "프라임 타워가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_travel label" @@ -2139,7 +2140,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_travel description" msgid "The maximum instantaneous velocity change with which travel moves are made." -msgstr "" +msgstr "이동이 이동하는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_layer_0 label" @@ -2149,7 +2150,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_layer_0 description" msgid "The print maximum instantaneous velocity change for the initial layer." -msgstr "" +msgstr "초기 레이어의 인쇄 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_print_layer_0 label" @@ -2159,7 +2160,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 description" msgid "The maximum instantaneous velocity change during the printing of the initial layer." -msgstr "" +msgstr "초기 층의 인쇄 중 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 label" @@ -2169,7 +2170,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 description" msgid "The acceleration for travel moves in the initial layer." -msgstr "" +msgstr "이동 가속도는 초기 레이어에서 이동합니다. " #: fdmprinter.def.json msgctxt "jerk_skirt_brim label" @@ -2179,7 +2180,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_skirt_brim description" msgid "The maximum instantaneous velocity change with which the skirt and brim are printed." -msgstr "" +msgstr "스커트와 고리가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "travel label" @@ -2189,7 +2190,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel description" msgid "travel" -msgstr "" +msgstr "이동 " #: fdmprinter.def.json msgctxt "retraction_combing label" @@ -2199,7 +2200,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only." -msgstr "" +msgstr "빗질은 여행 할 때 이미 인쇄 된 영역 내에 노즐을 유지합니다. 이로 인해 여행 이동이 약간 더 길어 지지만 수축의 필요성은 줄어 듭니다. 빗질이 꺼져 있으면 재료가 후퇴하고 노즐이 직선으로 다음 점으로 이동합니다. 또한 infill 내에서만 빗질하여 상 / 하 피부 영역을 빗질하는 것을 피할 수 있습니다. " #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2224,7 +2225,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall description" msgid "Always retract when moving to start an outer wall." -msgstr "" +msgstr "외벽을 시작하기 위해 이동할 때 항상 후퇴합니다. " #: fdmprinter.def.json msgctxt "travel_avoid_other_parts label" @@ -2234,7 +2235,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel_avoid_other_parts description" msgid "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled." -msgstr "" +msgstr "노즐은 여행 할 때 이미 인쇄 된 부품을 피합니다. 이 옵션은 빗질이 활성화 된 경우에만 사용할 수 있습니다. " #: fdmprinter.def.json msgctxt "travel_avoid_distance label" @@ -2244,7 +2245,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "travel_avoid_distance description" msgid "The distance between the nozzle and already printed parts when avoiding during travel moves." -msgstr "" +msgstr "이동 중에 피할 때 노즐과 이미 인쇄 된 부분 사이의 거리. " #: fdmprinter.def.json msgctxt "start_layers_at_same_position label" @@ -2254,7 +2255,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "start_layers_at_same_position description" msgid "In each layer start with printing the object near the same point, so that we don't start a new layer with printing the piece which the previous layer ended with. This makes for better overhangs and small parts, but increases printing time." -msgstr "" +msgstr "각 레이어에서 같은 지점 근처에 개체를 인쇄하는 것으로 시작하여 이전 레이어가 끝난 부분을 인쇄하여 새 레이어를 시작하지 마십시오. 이것은 오버행 (overhangs) 및 작은 부품을 개선하지만 인쇄 시간을 증가시킵니다. " #: fdmprinter.def.json msgctxt "layer_start_x label" @@ -2264,7 +2265,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "layer_start_x description" msgid "The X coordinate of the position near where to find the part to start printing each layer." -msgstr "" +msgstr "각 레이어의 인쇄를 시작할 부분을 찾을 위치 근처의 X 좌표입니다. " #: fdmprinter.def.json msgctxt "layer_start_y label" @@ -2274,7 +2275,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "layer_start_y description" msgid "The Y coordinate of the position near where to find the part to start printing each layer." -msgstr "" +msgstr "각 레이어 인쇄를 시작할 부분을 찾을 위치 근처의 위치에 대한 Y 좌표입니다. " #: fdmprinter.def.json msgctxt "retraction_hop_enabled label" @@ -2284,7 +2285,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_hop_enabled description" msgid "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate." -msgstr "" +msgstr "수축이 완료 될 때마다 빌드 플레이트가 내려져 노즐과 인쇄물 사이에 여유 공간이 생깁니다. 이동 이동 중에 노즐이 인쇄물에 부딪치지 않도록하여 인쇄판을 노크 할 기회를 줄입니다. " #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides label" @@ -2294,7 +2295,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides description" msgid "Only perform a Z Hop when moving over printed parts which cannot be avoided by horizontal motion by Avoid Printed Parts when Traveling." -msgstr "" +msgstr "이동 시, 인쇄물을 피함으로써 수평 이동으로 피할 수없는 인쇄물 위로 이동할 때만 Z 홉을 수행하십시오." #: fdmprinter.def.json msgctxt "retraction_hop label" @@ -2304,7 +2305,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_hop description" msgid "The height difference when performing a Z Hop." -msgstr "" +msgstr "Z 홉을 수행 할 때의 높이 차이. " #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch label" @@ -2314,7 +2315,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch description" msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print." -msgstr "" +msgstr "기계가 하나의 압출기에서 다른 압출기로 전환 된 후, 빌드 플레이트가 하강되어 노즐과 인쇄물 사이에 간극이 생깁니다. 이렇게하면 노즐이 인쇄물의 외부에 흘러 나올 수 있습니다. " #: fdmprinter.def.json msgctxt "cooling label" @@ -2324,7 +2325,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cooling description" msgid "Cooling" -msgstr "" +msgstr "냉각 " #: fdmprinter.def.json msgctxt "cool_fan_enabled label" @@ -2334,7 +2335,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_enabled description" msgid "Enables the print cooling fans while printing. The fans improve print quality on layers with short layer times and bridging / overhangs." -msgstr "" +msgstr "인쇄 중에 인쇄 냉각 팬을 활성화합니다. 팬은 짧은 레이어 시간 및 브리징 / 오버행으로 레이어의 인쇄 품질을 향상시킵니다. " #: fdmprinter.def.json msgctxt "cool_fan_speed label" @@ -2344,7 +2345,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_speed description" msgid "The speed at which the print cooling fans spin." -msgstr "" +msgstr "인쇄 냉각 팬이 회전하는 속도입니다. " #: fdmprinter.def.json msgctxt "cool_fan_speed_min label" @@ -2354,7 +2355,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_speed_min description" msgid "The speed at which the fans spin before hitting the threshold. When a layer prints faster than the threshold, the fan speed gradually inclines towards the maximum fan speed." -msgstr "" +msgstr "팬이 임계 값에 도달하기 전에 회전하는 속도입니다. 레이어가 임계 값보다 빠르게 인쇄되면 팬 속도가 최대 팬 속도쪽으로 점차 기울어집니다. " #: fdmprinter.def.json msgctxt "cool_fan_speed_max label" @@ -2364,7 +2365,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_speed_max description" msgid "The speed at which the fans spin on the minimum layer time. The fan speed gradually increases between the regular fan speed and maximum fan speed when the threshold is hit." -msgstr "" +msgstr "최소 레이어 시간에 팬이 회전하는 속도입니다. 임계 값에 도달하면 일반 팬 속도와 최대 팬 속도 사이에서 팬 속도가 서서히 증가합니다. " #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max label" @@ -2374,7 +2375,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max description" msgid "The layer time which sets the threshold between regular fan speed and maximum fan speed. Layers that print slower than this time use regular fan speed. For faster layers the fan speed gradually increases towards the maximum fan speed." -msgstr "" +msgstr "정규 팬 속도와 최대 팬 속도 사이의 임계 값을 설정하는 레이어 시간입니다. 이 시간보다 느리게 인쇄되는 레이어는 일반 팬 속도를 사용합니다. 빠른 레이어의 경우 팬 속도가 최대 팬 속도쪽으로 점차 증가합니다. " #: fdmprinter.def.json msgctxt "cool_fan_speed_0 label" @@ -2384,7 +2385,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_speed_0 description" msgid "The speed at which the fans spin at the start of the print. In subsequent layers the fan speed is gradually increased up to the layer corresponding to Regular Fan Speed at Height." -msgstr "" +msgstr "인쇄 시작시 팬이 회전하는 속도입니다. 후속 레이어에서는 팬 속도가 높이의 일반 팬 속도에 해당하는 레이어까지 점차 증가합니다. " #: fdmprinter.def.json msgctxt "cool_fan_full_at_height label" @@ -2394,7 +2395,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_full_at_height description" msgid "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from Initial Fan Speed to Regular Fan Speed." -msgstr "" +msgstr "일반 팬 속도로 팬이 회전하는 높이입니다. 아래의 레이어에서 팬 속도는 초기 팬 속도에서 정규 팬 속도로 점차 증가합니다. " #: fdmprinter.def.json msgctxt "cool_fan_full_layer label" @@ -2404,7 +2405,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_fan_full_layer description" msgid "The layer at which the fans spin on regular fan speed. If regular fan speed at height is set, this value is calculated and rounded to a whole number." -msgstr "" +msgstr "팬이 일반 팬 속도로 회전하는 레이어입니다. 높이의 일반 팬 속도를 설정하면이 값이 계산되고 정수로 반올림됩니다. " #: fdmprinter.def.json msgctxt "cool_min_layer_time label" @@ -2414,7 +2415,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_min_layer_time description" msgid "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated." -msgstr "" +msgstr "레이어에 소요 된 최소 시간입니다. 이렇게하면 프린터가 느려지고 적어도 한 번에 여기에 설정된 시간을 소비하게됩니다. 이렇게하면 다음 레이어를 인쇄하기 전에 인쇄물을 적절히 냉각시킬 수 있습니다. 리프트 헤드가 비활성화되고 최소 속도가 위반되는 경우 레이어가 최소 레이어 시간보다 짧게 걸릴 수 있습니다. " #: fdmprinter.def.json msgctxt "cool_min_speed label" @@ -2424,7 +2425,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_min_speed description" msgid "The minimum print speed, despite slowing down due to the minimum layer time. When the printer would slow down too much, the pressure in the nozzle would be too low and result in bad print quality." -msgstr "" +msgstr "최소 레이어 시간으로 인해 속도가 느려지 긴하지만 최소 인쇄 속도. 프린터의 속도가 너무 느려지면 노즐의 압력이 너무 낮아 인쇄 품질이 나빠질 수 있습니다. " #: fdmprinter.def.json msgctxt "cool_lift_head label" @@ -2434,7 +2435,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cool_lift_head description" msgid "When the minimum speed is hit because of minimum layer time, lift the head away from the print and wait the extra time until the minimum layer time is reached." -msgstr "" +msgstr "최소한의 레이어 시간으로 인해 최소 속도에 도달하면 헤드를 인쇄물에서 들어 올려 최소 레이어 시간에 도달 할 때까지 여분의 시간을 기다리십시오. " #: fdmprinter.def.json msgctxt "support label" @@ -2444,7 +2445,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support description" msgid "Support" -msgstr "" +msgstr "지지구조 " #: fdmprinter.def.json msgctxt "support_enable label" @@ -2454,7 +2455,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_enable description" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." -msgstr "" +msgstr "돌출부가있는 모델 부분을 지원하는 구조를 생성합니다. 이러한 구조가 없으면 이러한 부분이 인쇄 중에 붕괴됩니다. " #: fdmprinter.def.json msgctxt "support_extruder_nr label" @@ -2464,7 +2465,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_extruder_nr description" msgid "The extruder train to use for printing the support. This is used in multi-extrusion." -msgstr "" +msgstr "지지체 인쇄에 사용할 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "support_infill_extruder_nr label" @@ -2474,7 +2475,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_infill_extruder_nr description" msgid "The extruder train to use for printing the infill of the support. This is used in multi-extrusion." -msgstr "" +msgstr "지지대의 충전물을 인쇄하는 데 사용할 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 label" @@ -2484,7 +2485,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 description" msgid "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion." -msgstr "" +msgstr "제 1 층의 지지체 충전 용 인쇄에 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "support_interface_extruder_nr label" @@ -2494,7 +2495,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_extruder_nr description" msgid "The extruder train to use for printing the roofs and floors of the support. This is used in multi-extrusion." -msgstr "" +msgstr "지지대의 지붕과 바닥을 인쇄 할 때 사용하는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "support_roof_extruder_nr label" @@ -2504,7 +2505,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr description" msgid "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion." -msgstr "" +msgstr "지지대의 지붕을 인쇄 할 때 사용하는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr label" @@ -2514,7 +2515,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr description" msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion." -msgstr "" +msgstr "지지대의 바닥을 인쇄하는 데 사용할 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "support_type label" @@ -2524,7 +2525,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_type description" msgid "Adjusts the placement of the support structures. The placement can be set to touching build plate or everywhere. When set to everywhere the support structures will also be printed on the model." -msgstr "" +msgstr "지지 구조의 배치를 조정합니다. 배치는 빌드 플레이트 또는 모든 곳을 터치하도록 설정할 수 있습니다. 모든 곳에 설정하면 모델에 지원 구조가 인쇄됩니다. " #: fdmprinter.def.json msgctxt "support_type option buildplate" @@ -2544,7 +2545,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_angle description" msgid "The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support." -msgstr "" +msgstr "지원이 추가 된 오버행 각도의 최소값입니다. 0 °의 값에서 모든 돌출부가 지원되며 90 °는 지원하지 않습니다. " #: fdmprinter.def.json msgctxt "support_pattern label" @@ -2554,7 +2555,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_pattern description" msgid "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support." -msgstr "" +msgstr "프린트의지지 구조의 패턴. 사용 가능한 여러 가지 옵션을 사용하면 튼튼하고 쉽게 제거 할 수 있습니다. " #: fdmprinter.def.json msgctxt "support_pattern option lines" @@ -2594,7 +2595,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." -msgstr "" +msgstr "지그재그를 연결하십시오. 이것은 지그재그지지 구조의 강도를 증가시킵니다. " #: fdmprinter.def.json msgctxt "support_infill_rate label" @@ -2604,7 +2605,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_infill_rate description" msgid "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "" +msgstr "지지 구조의 밀도를 조정합니다. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " #: fdmprinter.def.json msgctxt "support_line_distance label" @@ -2614,7 +2615,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_line_distance description" msgid "Distance between the printed support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "인쇄 된지지 구조 선 사이의 거리. 이 설정은 지원 밀도로 계산됩니다. " #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -2624,7 +2625,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_z_distance description" msgid "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height." -msgstr "" +msgstr "지지 구조의 위 / 아래에서 인쇄까지의 거리. 이 틈새는 모형 인쇄 후 지지대를 제거하기위한 공간을 제공합니다. 이 값은 레이어 높이의 배수로 반올림됩니다. " #: fdmprinter.def.json msgctxt "support_top_distance label" @@ -2634,7 +2635,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_top_distance description" msgid "Distance from the top of the support to the print." -msgstr "" +msgstr "지원 상단에서 인쇄까지의 거리. " #: fdmprinter.def.json msgctxt "support_bottom_distance label" @@ -2644,7 +2645,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_distance description" msgid "Distance from the print to the bottom of the support." -msgstr "" +msgstr "인쇄물에서 지지대의 바닥까지의 거리. " #: fdmprinter.def.json msgctxt "support_xy_distance label" @@ -2654,7 +2655,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_xy_distance description" msgid "Distance of the support structure from the print in the X/Y directions." -msgstr "" +msgstr "X / Y 방향에서 인쇄물로부터지지 구조까지의 거리. " #: fdmprinter.def.json msgctxt "support_xy_overrides_z label" @@ -2664,7 +2665,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_xy_overrides_z description" msgid "Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs." -msgstr "" +msgstr "지원 X / Y 거리가지지 Z 거리를 무시하는지 여부를 나타냅니다. X / Y가 Z를 오버라이드하면 X / Y 거리는 모델에서 지지점을 밀어내어 돌출부까지의 실제 Z 거리에 영향을 줄 수 있습니다. 오버행 주위에 X / Y 거리를 적용하지 않음으로써이 기능을 비활성화 할 수 있습니다. " #: fdmprinter.def.json msgctxt "support_xy_overrides_z option xy_overrides_z" @@ -2684,7 +2685,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang description" msgid "Distance of the support structure from the overhang in the X/Y directions. " -msgstr "" +msgstr "X / Y 방향에서 오버행으로부터지지 구조까지의 거리. " #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height label" @@ -2694,7 +2695,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height description" msgid "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures. Set to zero to turn off the stair-like behaviour." -msgstr "" +msgstr "모델에있는 지지대의 계단 모양 바닥의 계단 높이. 값이 낮 으면 지원을 제거하기가 어려워 지지만 값이 너무 높으면 불안정한 지원 구조가 생길 수 있습니다. 계단 모양의 동작을 해제하려면 0으로 설정하십시오. " #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width label" @@ -2704,7 +2705,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width description" msgid "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures." -msgstr "" +msgstr "모델에있는 지지대의 계단 모양 바닥의 최대 폭. 값이 낮 으면 지원을 제거하기가 어려워 지지만 값이 너무 높으면 불안정한 지원 구조가 생길 수 있습니다. " #: fdmprinter.def.json msgctxt "support_join_distance label" @@ -2714,7 +2715,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_join_distance description" msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one." -msgstr "" +msgstr "X / Y 방향으로지지 구조물 사이의 최대 거리. 별도의 구조가이 값보다 가깝게 있으면 구조가 하나로 합쳐집니다. " #: fdmprinter.def.json msgctxt "support_offset label" @@ -2724,7 +2725,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_offset description" msgid "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support." -msgstr "" +msgstr "각 레이어의 모든 지원 다각형에 적용된 오프셋의 양입니다. 양수 값을 사용하면 지원 영역이 원활 해지며보다 견고한 지원을받을 수 있습니다. " #: fdmprinter.def.json msgctxt "support_interface_enable label" @@ -2734,7 +2735,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_enable description" msgid "Generate a dense interface between the model and the support. This will create a skin at the top of the support on which the model is printed and at the bottom of the support, where it rests on the model." -msgstr "" +msgstr "모델과 지원 사이에 조밀 한 인터페이스를 생성하십시오. 이렇게하면 모델이 인쇄 된 지원 맨 위의 스킨과 모델의 위에있는 지원 맨 아래에 스킨이 만들어집니다. " #: fdmprinter.def.json msgctxt "support_roof_enable label" @@ -2744,7 +2745,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_enable description" msgid "Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support." -msgstr "" +msgstr "지지대 상단과 모델 사이에 조밀 한 슬래브를 생성하십시오. 그러면 모델과 지원 사이에 스킨이 만들어집니다. " #: fdmprinter.def.json msgctxt "support_bottom_enable label" @@ -2754,7 +2755,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_enable description" msgid "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support." -msgstr "" +msgstr "지지대 바닥과 모델 사이에 조밀 한 슬래브를 생성하십시오. 그러면 모델과 지원 사이에 스킨이 만들어집니다. " #: fdmprinter.def.json msgctxt "support_interface_height label" @@ -2764,7 +2765,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_height description" msgid "The thickness of the interface of the support where it touches with the model on the bottom or the top." -msgstr "" +msgstr "밑면 또는 상단의 모델과 접촉하는 지지점의 인터페이스 두께입니다. " #: fdmprinter.def.json msgctxt "support_roof_height label" @@ -2774,7 +2775,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_height description" msgid "The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests." -msgstr "" +msgstr "받침 지붕의 두께. 이것은 모델이 놓이는 받침대 상단의 조밀 한 층의 양을 제어합니다. " #: fdmprinter.def.json msgctxt "support_bottom_height label" @@ -2784,7 +2785,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_height description" msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." -msgstr "" +msgstr "지지 층의 두께. 이것은 지지대가 놓여있는 모델의 상단에 인쇄되는 조밀 한 층의 수를 제어합니다. " #: fdmprinter.def.json msgctxt "support_interface_skip_height label" @@ -2794,7 +2795,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_skip_height description" msgid "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface." -msgstr "" +msgstr "지원 모델의 위와 아래에 모델이 있는지 확인하려면 주어진 높이의 단계를 수행하십시오. 값이 낮을수록 슬라이스가 느려지고, 값이 높을수록 지원 인터페이스가 있어야하는 곳에서는 정상적인 지원이 인쇄 될 수 있습니다. " #: fdmprinter.def.json msgctxt "support_interface_density label" @@ -2804,7 +2805,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_density description" msgid "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "" +msgstr "지지 구조의 지붕 및 바닥 밀도를 조정합니다. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " #: fdmprinter.def.json msgctxt "support_roof_density label" @@ -2814,7 +2815,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_density description" msgid "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "" +msgstr "지지 구조의 지붕의 밀도. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " #: fdmprinter.def.json msgctxt "support_roof_line_distance label" @@ -2824,7 +2825,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_line_distance description" msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." -msgstr "" +msgstr "인쇄 된 지붕 루프 사이의 거리. 이 설정은지지 지붕 밀도에 의해 계산되지만 별도로 조정할 수 있습니다. " #: fdmprinter.def.json msgctxt "support_bottom_density label" @@ -2834,7 +2835,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_density description" msgid "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model." -msgstr "" +msgstr "지지 구조체의 바닥 밀도. 값이 높을수록 지지대가 모델 위에 더 잘 접착됩니다. " #: fdmprinter.def.json msgctxt "support_bottom_line_distance label" @@ -2844,7 +2845,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_line_distance description" msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." -msgstr "" +msgstr "인쇄 된지지 플로어 사이의 거리. 이 설정은 Support Floor Density로 계산되지만 별도로 조정할 수 있습니다. " #: fdmprinter.def.json msgctxt "support_interface_pattern label" @@ -2854,7 +2855,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_interface_pattern description" msgid "The pattern with which the interface of the support with the model is printed." -msgstr "" +msgstr "모델과 지원 인터페이스를 인쇄하는 패턴입니다. " #: fdmprinter.def.json msgctxt "support_interface_pattern option lines" @@ -2894,7 +2895,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." -msgstr "" +msgstr "지지대의 지붕이 인쇄되는 패턴. " #: fdmprinter.def.json msgctxt "support_roof_pattern option lines" @@ -2934,7 +2935,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_pattern description" msgid "The pattern with which the floors of the support are printed." -msgstr "" +msgstr "받침대의 바닥이 인쇄되는 패턴. " #: fdmprinter.def.json msgctxt "support_bottom_pattern option lines" @@ -2974,7 +2975,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_use_towers description" msgid "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof." -msgstr "" +msgstr "작은 돌출 부분을 지원하기 위해 특수한 탑을 사용하십시오. 이 타워들은 그들이 지원하는 지역보다 더 큰 지름을 가지고 있습니다. 오버행 부근에서 타워의 직경이 감소하여 지붕을 형성합니다. " #: fdmprinter.def.json msgctxt "support_tower_diameter label" @@ -2984,7 +2985,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_tower_diameter description" msgid "The diameter of a special tower." -msgstr "" +msgstr "특수 타워의 지름. " #: fdmprinter.def.json msgctxt "support_minimal_diameter label" @@ -2994,7 +2995,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_minimal_diameter description" msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower." -msgstr "" +msgstr "특수 지지대에 의해지지 될 작은 영역의 X / Y 방향의 최소 직경. " #: fdmprinter.def.json msgctxt "support_tower_roof_angle label" @@ -3004,7 +3005,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_tower_roof_angle description" msgid "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs." -msgstr "" +msgstr "타워 옥상의 각도입니다. 높은 값을 지정하면 뾰족한 타워 지붕이되고, 값이 낮을수록 평평한 타워 지붕이됩니다. " #: fdmprinter.def.json msgctxt "platform_adhesion label" @@ -3014,7 +3015,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "platform_adhesion description" msgid "Adhesion" -msgstr "" +msgstr "부착 " #: fdmprinter.def.json msgctxt "prime_blob_enable label" @@ -3024,7 +3025,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_blob_enable description" msgid "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time." -msgstr "" +msgstr "인쇄하기 전에 얼룩으로 필라멘트를 프라이밍할지 여부. 이 설정을 켜면 인쇄하기 전에 압출기가 노즐에서 재료를 준비 할 수 있습니다. 가장자리 또는 스커트 인쇄는 프라이밍처럼 작동 할 수 있습니다.이 경우이 설정을 해제하면 시간이 절약됩니다. " #: fdmprinter.def.json msgctxt "extruder_prime_pos_x label" @@ -3034,7 +3035,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "extruder_prime_pos_x description" msgid "The X coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 X 좌표입니다. " #: fdmprinter.def.json msgctxt "extruder_prime_pos_y label" @@ -3044,7 +3045,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "extruder_prime_pos_y description" msgid "The Y coordinate of the position where the nozzle primes at the start of printing." -msgstr "" +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 Y 좌표입니다. " #: fdmprinter.def.json msgctxt "adhesion_type label" @@ -3054,7 +3055,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "adhesion_type description" msgid "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your model to prevent warping. Raft adds a thick grid with a roof below the model. Skirt is a line printed around the model, but not connected to the model." -msgstr "" +msgstr "귀하의 압출 및 빌드 플레이트에 대한 접착력을 향상시키는 데 도움이되는 다양한 옵션. 브림은 뒤틀림을 방지하기 위해 모델 바닥 주위에 단층 평면 영역을 추가합니다. 래프트는 모델 아래에 지붕이있는 두꺼운 격자를 추가합니다. 치마는 모델 주변에 인쇄 된 선이지만 모델에는 연결되어 있지 않습니다. " #: fdmprinter.def.json msgctxt "adhesion_type option skirt" @@ -3084,7 +3085,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "adhesion_extruder_nr description" msgid "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion." -msgstr "" +msgstr "스커트 / 가장자리 / 래프트 인쇄에 사용하는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #: fdmprinter.def.json msgctxt "skirt_line_count label" @@ -3094,7 +3095,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skirt_line_count description" msgid "Multiple skirt lines help to prime your extrusion better for small models. Setting this to 0 will disable the skirt." -msgstr "" +msgstr "여러 개의 스커트 라인을 사용하여 작은 모델에 더 잘 압출 성형 할 수 있습니다. 이것을 \"0\"으로 설정하면 스커트가 비활성화됩니다. " #: fdmprinter.def.json msgctxt "skirt_gap label" @@ -3106,7 +3107,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3116,7 +3117,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length description" msgid "The minimum length of the skirt or brim. If this length is not reached by all skirt or brim lines together, more skirt or brim lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored." -msgstr "" +msgstr "스커트 또는 고리의 최소 길이. 이 길이에 모든 스커트 또는 브림 선이 모두 도달하지 않으면 최소 길이에 도달 할 때까지 더 많은 스커트 또는 브림 선이 추가됩니다. 참고 : 줄 수를 \"0\"으로 설정하면 무시됩니다." #: fdmprinter.def.json msgctxt "brim_width label" @@ -3126,7 +3127,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "brim_width description" msgid "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area." -msgstr "" +msgstr "모델에서 가장 바깥 쪽 가장자리까지의 거리입니다. 큰 테두리는 빌드 플레이트에 대한 접착력을 향상 시키지만 효과적인 인쇄 영역도 감소시킵니다. " #: fdmprinter.def.json msgctxt "brim_line_count label" @@ -3136,7 +3137,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "brim_line_count description" msgid "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area." -msgstr "" +msgstr "가장자리에 사용되는 선의 수입니다. 더 많은 브림 선이 빌드 플레이트에 대한 접착력을 향상 시키지만 유효 프린트 영역도 감소시킵니다. " #: fdmprinter.def.json msgctxt "brim_outside_only label" @@ -3146,7 +3147,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." -msgstr "" +msgstr "모델 바깥 쪽 가장자리에만 인쇄하십시오. 이렇게하면 나중에 제거해야하는 가장자리의 양이 줄어들지 만 침대 접착력은 그렇게 많이 줄어들지 않습니다. " #: fdmprinter.def.json msgctxt "raft_margin label" @@ -3156,7 +3157,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_margin description" msgid "If the raft is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print." -msgstr "" +msgstr "래프트가 활성화 된 경우 래프트가 주어진 모델 주변의 추가 뗏목 지역입니다. 이 여백을 늘리면 재료를 더 많이 사용하고 인쇄물을 적게 차지하면서 더 강력한 래프트가 만들어집니다. " #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3166,7 +3167,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap description" msgid "The gap between the final raft layer and the first layer of the model. Only the first layer is raised by this amount to lower the bonding between the raft layer and the model. Makes it easier to peel off the raft." -msgstr "" +msgstr "최종 래프트 층과 모델의 첫 번째 층 사이의 틈새. 래프트 층과 모델 사이의 결합을 낮추기 위해이 양만큼 첫 번째 층만 올립니다. 래프트를 쉽게 떼어 낼 수 있습니다. " #: fdmprinter.def.json msgctxt "layer_0_z_overlap label" @@ -3176,7 +3177,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "layer_0_z_overlap description" msgid "Make the first and second layer of the model overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount." -msgstr "" +msgstr "에어 갭에서 손실 된 필라멘트를 보완하기 위해 Z 방향으로 모델의 첫 번째와 두 번째 레이어가 중첩되도록하십시오. 첫 번째 모델 레이어 위의 모든 모델은이 양만큼 아래로 이동합니다 " #: fdmprinter.def.json msgctxt "raft_surface_layers label" @@ -3186,7 +3187,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_layers description" msgid "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the model sits on. 2 layers result in a smoother top surface than 1." -msgstr "" +msgstr "두 번째 래프트 레이어 맨 위에있는 최상위 레이어의 수입니다. 이것들은 모델이 위치하는 완전히 채워진 레이어입니다. 2 층은 1보다 부드러운 표면을 만듭니다. " #: fdmprinter.def.json msgctxt "raft_surface_thickness label" @@ -3196,7 +3197,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_thickness description" msgid "Layer thickness of the top raft layers." -msgstr "" +msgstr "상단 래프트 레이어의 레이어 두께. " #: fdmprinter.def.json msgctxt "raft_surface_line_width label" @@ -3206,7 +3207,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_line_width description" msgid "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth." -msgstr "" +msgstr "래프트의 윗면에있는 선의 폭. 래프트의 상단이 매끄럽도록 얇은 선으로 구성 될 수 있습니다. " #: fdmprinter.def.json msgctxt "raft_surface_line_spacing label" @@ -3216,7 +3217,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_line_spacing description" msgid "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid." -msgstr "" +msgstr "상단 래프트 레이어에 대한 래프트 사이의 거리. 간격은 선 너비와 동일해야 표면이 단색입니다. " #: fdmprinter.def.json msgctxt "raft_interface_thickness label" @@ -3226,7 +3227,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_thickness description" msgid "Layer thickness of the middle raft layer." -msgstr "" +msgstr "중간 래프트 층의 층 두께. " #: fdmprinter.def.json msgctxt "raft_interface_line_width label" @@ -3236,7 +3237,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_line_width description" msgid "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the build plate." -msgstr "" +msgstr "중간 래프트 층의 선폭. 두 번째 레이어를 더 돌출 시키면 선이 빌드 플레이트에 달라 붙습니다. " #: fdmprinter.def.json msgctxt "raft_interface_line_spacing label" @@ -3246,7 +3247,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_line_spacing description" msgid "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers." -msgstr "" +msgstr "중간 래프트 층에 대한 래프트 사이의 거리. 중간 틈새는 매우 넓어야하며 래프트 상부 층을지지 할만큼 충분히 촘촘해야합니다. " #: fdmprinter.def.json msgctxt "raft_base_thickness label" @@ -3256,7 +3257,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_thickness description" msgid "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate." -msgstr "" +msgstr "기본 래프트 레이어의 레이어 두께. 이것은 프린터 빌드 플레이트에 단단히 붙어있는 두꺼운 층이어야합니다. " #: fdmprinter.def.json msgctxt "raft_base_line_width label" @@ -3266,7 +3267,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_line_width description" msgid "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion." -msgstr "" +msgstr "기본 래프트 층에있는 선의 너비. 이것은 빌드 플레이트 접착을 돕기 위해 두꺼운 선이어야합니다. " #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" @@ -3276,7 +3277,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" msgid "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate." -msgstr "" +msgstr "기본 래프트 층에 대한 래프트 사이의 거리. 넓은 간격으로 빌드 플레이트에서 래프트를 쉽게 제거 할 수 있습니다. " #: fdmprinter.def.json msgctxt "raft_speed label" @@ -3286,7 +3287,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_speed description" msgid "The speed at which the raft is printed." -msgstr "" +msgstr "래프트가 인쇄되는 속도. " #: fdmprinter.def.json msgctxt "raft_surface_speed label" @@ -3296,7 +3297,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_speed description" msgid "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines." -msgstr "" +msgstr "상단 래프트 레이어가 인쇄되는 속도입니다. 이 노즐은 조금 더 느리게 인쇄해야 노즐이 인접한 표면 선을 천천히 부드럽게 할 수 있습니다. " #: fdmprinter.def.json msgctxt "raft_interface_speed label" @@ -3306,7 +3307,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_speed description" msgid "The speed at which the middle raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high." -msgstr "" +msgstr "중간 래프트 층이 인쇄되는 속도. 이것은 노즐에서 나오는 재료의 양이 상당히 많기 때문에 아주 천천히 인쇄되어야합니다. " #: fdmprinter.def.json msgctxt "raft_base_speed label" @@ -3316,7 +3317,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_speed description" msgid "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high." -msgstr "" +msgstr "기본 래프트 레이어가 인쇄되는 속도입니다. 이것은 노즐에서 나오는 재료의 양이 상당히 많기 때문에 아주 천천히 인쇄되어야합니다. " #: fdmprinter.def.json msgctxt "raft_acceleration label" @@ -3326,7 +3327,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_acceleration description" msgid "The acceleration with which the raft is printed." -msgstr "" +msgstr "래프트가 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "raft_surface_acceleration label" @@ -3336,7 +3337,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_acceleration description" msgid "The acceleration with which the top raft layers are printed." -msgstr "" +msgstr "상단 래프트 레이어가 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "raft_interface_acceleration label" @@ -3346,7 +3347,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_acceleration description" msgid "The acceleration with which the middle raft layer is printed." -msgstr "" +msgstr "중간 래프트 층이 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "raft_base_acceleration label" @@ -3356,7 +3357,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_acceleration description" msgid "The acceleration with which the base raft layer is printed." -msgstr "" +msgstr "기본 래프트 레이어가 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "raft_jerk label" @@ -3366,7 +3367,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_jerk description" msgid "The jerk with which the raft is printed." -msgstr "" +msgstr "래프트와 함께 인쇄되는 저크. " #: fdmprinter.def.json msgctxt "raft_surface_jerk label" @@ -3376,7 +3377,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_jerk description" msgid "The jerk with which the top raft layers are printed." -msgstr "" +msgstr "상단 래프트 레이어가 인쇄되는 저크. " #: fdmprinter.def.json msgctxt "raft_interface_jerk label" @@ -3386,7 +3387,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_jerk description" msgid "The jerk with which the middle raft layer is printed." -msgstr "" +msgstr "중간 래프트 층이 인쇄되는 저크. " #: fdmprinter.def.json msgctxt "raft_base_jerk label" @@ -3396,7 +3397,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_jerk description" msgid "The jerk with which the base raft layer is printed." -msgstr "" +msgstr "기본 래프트 레이어가 인쇄되는 저크. " #: fdmprinter.def.json msgctxt "raft_fan_speed label" @@ -3406,7 +3407,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_fan_speed description" msgid "The fan speed for the raft." -msgstr "" +msgstr "래프트의 팬 속도. " #: fdmprinter.def.json msgctxt "raft_surface_fan_speed label" @@ -3416,7 +3417,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_surface_fan_speed description" msgid "The fan speed for the top raft layers." -msgstr "" +msgstr "상단 래프트 레이어의 팬 속도입니다. " #: fdmprinter.def.json msgctxt "raft_interface_fan_speed label" @@ -3426,7 +3427,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_interface_fan_speed description" msgid "The fan speed for the middle raft layer." -msgstr "" +msgstr "중간 래프트 레이어의 팬 속도입니다. " #: fdmprinter.def.json msgctxt "raft_base_fan_speed label" @@ -3436,7 +3437,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_base_fan_speed description" msgid "The fan speed for the base raft layer." -msgstr "" +msgstr "기본 래프트 레이어의 팬 속도입니다. " #: fdmprinter.def.json msgctxt "dual label" @@ -3446,7 +3447,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "dual description" msgid "Settings used for printing with multiple extruders." -msgstr "" +msgstr "여러 압출기로 인쇄 할 때 사용되는 설정입니다. " #: fdmprinter.def.json msgctxt "prime_tower_enable label" @@ -3456,7 +3457,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_enable description" msgid "Print a tower next to the print which serves to prime the material after each nozzle switch." -msgstr "" +msgstr "각 노즐을 교체 한 후에 재료를 프라이밍(Priming)하는 인쇄 옆에 타워를 인쇄하십시오. " #: fdmprinter.def.json msgctxt "prime_tower_size label" @@ -3466,7 +3467,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_size description" msgid "The width of the prime tower." -msgstr "" +msgstr "프라임 타워의 너비." #: fdmprinter.def.json msgctxt "prime_tower_min_volume label" @@ -3476,7 +3477,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_min_volume description" msgid "The minimum volume for each layer of the prime tower in order to purge enough material." -msgstr "" +msgstr "충분한 재료를 퍼지하기 위해 프라임 타워 각 층의 최소 부피. " #: fdmprinter.def.json msgctxt "prime_tower_wall_thickness label" @@ -3486,7 +3487,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_wall_thickness description" msgid "The thickness of the hollow prime tower. A thickness larger than half the Prime Tower Minimum Volume will result in a dense prime tower." -msgstr "" +msgstr "속이 빈 프라임 타워의 두께. 프라임 타워의 최소 볼륨의 절반보다 큰 두께는 조밀 한 소수 타워가됩니다. " #: fdmprinter.def.json msgctxt "prime_tower_position_x label" @@ -3496,7 +3497,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_position_x description" msgid "The x coordinate of the position of the prime tower." -msgstr "" +msgstr "프라임 타워 위치의 x 좌표입니다. " #: fdmprinter.def.json msgctxt "prime_tower_position_y label" @@ -3506,7 +3507,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_position_y description" msgid "The y coordinate of the position of the prime tower." -msgstr "" +msgstr "프라임 타워 위치의 y 좌표입니다. " #: fdmprinter.def.json msgctxt "prime_tower_flow label" @@ -3516,7 +3517,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_flow description" msgid "Flow compensation: the amount of material extruded is multiplied by this value." -msgstr "" +msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. " #: fdmprinter.def.json msgctxt "prime_tower_wipe_enabled label" @@ -3526,7 +3527,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "prime_tower_wipe_enabled description" msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower." -msgstr "" +msgstr "하나의 노즐로 프라임 타워를 인쇄 한 후, 다른 타워의 흙먼지 물질을 프라임 타워에서 닦아냅니다. " #: fdmprinter.def.json msgctxt "dual_pre_wipe label" @@ -3536,7 +3537,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "dual_pre_wipe description" msgid "After switching extruder, wipe the oozed material off of the nozzle on the first thing printed. This performs a safe slow wipe move at a place where the oozed material causes least harm to the surface quality of your print." -msgstr "" +msgstr "압출기를 전환 한 후, 인쇄 된 첫 번째 것을 노즐에서 닦아 낸 물질을 닦아냅니다. 이렇게하면 흘러 나온 물질이 인쇄물의 표면 품질에 가장 해를 입히는 곳에서 안전한 천천히 닦아줍니다. " #: fdmprinter.def.json msgctxt "ooze_shield_enabled label" @@ -3546,7 +3547,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "ooze_shield_enabled description" msgid "Enable exterior ooze shield. This will create a shell around the model which is likely to wipe a second nozzle if it's at the same height as the first nozzle." -msgstr "" +msgstr "외장 방음 장치를 사용하십시오. 이렇게하면 첫 번째 노즐과 동일한 높이에 두 번째 노즐을 닦을 가능성이있는 모델 주위에 쉘이 생깁니다. " #: fdmprinter.def.json msgctxt "ooze_shield_angle label" @@ -3556,7 +3557,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "ooze_shield_angle description" msgid "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material." -msgstr "" +msgstr "방패망의 한 부분이 가질 최대 각도입니다. \"0\"도가 수직이고 \"90\"도가 수평입니다. 각도가 작 으면 방풍망이 덜 파손되지만 재료는 더 많습니다. " #: fdmprinter.def.json msgctxt "ooze_shield_dist label" @@ -3566,7 +3567,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "ooze_shield_dist description" msgid "Distance of the ooze shield from the print, in the X/Y directions." -msgstr "" +msgstr "X / Y 방향으로 인쇄물에서 방패망까지의 거리. " #: fdmprinter.def.json msgctxt "meshfix label" @@ -3576,7 +3577,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "meshfix description" msgid "category_fixes" -msgstr "" +msgstr "카테고리 수정 " #: fdmprinter.def.json msgctxt "meshfix_union_all label" @@ -3586,7 +3587,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "meshfix_union_all description" msgid "Ignore the internal geometry arising from overlapping volumes within a mesh and print the volumes as one. This may cause unintended internal cavities to disappear." -msgstr "" +msgstr "메쉬 내의 겹치는 볼륨으로 인해 발생하는 내부 지오메트리를 무시하고 볼륨을 하나로 인쇄하십시오. 이로 인해 의도하지 않은 내부 공동이 사라질 수 있습니다. " #: fdmprinter.def.json msgctxt "meshfix_union_all_remove_holes label" @@ -3596,7 +3597,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "meshfix_union_all_remove_holes description" msgid "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below." -msgstr "" +msgstr "각 레이어의 구멍을 제거하고 바깥 쪽 모양 만 유지합니다. 이것은 보이지 않는 내부 지오메트리를 무시합니다. 그러나 위 또는 아래에서 볼 수있는 레이어 구멍도 무시합니다. " #: fdmprinter.def.json msgctxt "meshfix_extensive_stitching label" @@ -3606,7 +3607,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "meshfix_extensive_stitching description" msgid "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time." -msgstr "" +msgstr "광범위한 스티칭은 다각형을 만지면서 구멍을 닫음으로써 메쉬의 열린 구멍을 꿰매려합니다. 이 옵션은 많은 처리 시간을 초래할 수 있습니다. " #: fdmprinter.def.json msgctxt "meshfix_keep_open_polygons label" @@ -3616,7 +3617,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." -msgstr "" +msgstr "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이고 큰 구멍이있는 레이어의 부분을 제거하려고합니다. 이 옵션을 활성화하면 스티칭 할 수없는 파트가 유지됩니다. 이 옵션은 다른 모든 것이 올바른 GCode를 생성하지 못할 때 최후의 수단으로 사용해야합니다. " #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -3626,7 +3627,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap description" msgid "Make meshes which are touching each other overlap a bit. This makes them bond together better." -msgstr "" +msgstr "서로 닿는 메쉬가 조금 겹치게 만듭니다. 이것은 그들을 더 잘 묶는 것입니다. " #: fdmprinter.def.json msgctxt "carve_multiple_volumes label" @@ -3636,7 +3637,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "carve_multiple_volumes description" msgid "Remove areas where multiple meshes are overlapping with each other. This may be used if merged dual material objects overlap with each other." -msgstr "" +msgstr "여러 메시가 서로 겹치는 영역을 제거하십시오. 병합 된 이중 물체가 서로 중첩되는 경우이 값이 사용될 수 있습니다. " #: fdmprinter.def.json msgctxt "alternate_carve_order label" @@ -3646,7 +3647,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." -msgstr "" +msgstr "교차하는 메쉬로 교차하는 볼륨으로 전환하면 겹치는 메쉬가 서로 얽 히게됩니다. 이 설정을 해제하면 메시 중 하나가 다른 메시에서 제거되는 동안 오버랩의 모든 볼륨을 가져옵니다. " #: fdmprinter.def.json msgctxt "blackmagic label" @@ -3656,7 +3657,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "blackmagic description" msgid "category_blackmagic" -msgstr "" +msgstr "블랙매직 카테고리 " #: fdmprinter.def.json msgctxt "print_sequence label" @@ -3666,7 +3667,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "print_sequence description" msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes." -msgstr "" +msgstr "한 번에 한 레이어 씩 모든 모델을 인쇄할지 또는 한 모델이 완료 될 때까지 기다렸다가 다음 모델로 넘어갈 지 여부. 한 번에 한 가지 모드는 모든 모델이 분리되어 전체 프린트 헤드가 중간에서 움직일 수 있고 모든 모델이 노즐과 X / Y 축 사이의 거리보다 낮은 경우에만 가능합니다. " #: fdmprinter.def.json msgctxt "print_sequence option all_at_once" @@ -3686,7 +3687,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_mesh description" msgid "Use this mesh to modify the infill of other meshes with which it overlaps. Replaces infill regions of other meshes with regions for this mesh. It's suggested to only print one Wall and no Top/Bottom Skin for this mesh." -msgstr "" +msgstr "관련 메쉬를 사용하여 겹치는 다른 메쉬의 충진율을 수정하십시오. 다른 메쉬의 충진 영역을 본 메쉬의 영역으로 대체합니다. 본 메쉬에 하나의 벽과 상단 / 밑바닥 스킨만을 인쇄하는 것이 좋습니다. " #: fdmprinter.def.json msgctxt "infill_mesh_order label" @@ -3696,7 +3697,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_mesh_order description" msgid "Determines which infill mesh is inside the infill of another infill mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes." -msgstr "" +msgstr "어떤 충진 메쉬가 다른 충진 메쉬의 충진 내부에 있는지 결정합니다. 더 높은 차수의 충진 메쉬는 더 낮은 차수와 일반적인 메쉬로 충진 메쉬의 충진을 수정합니다. " #: fdmprinter.def.json msgctxt "cutting_mesh label" @@ -3706,7 +3707,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "cutting_mesh description" msgid "Limit the volume of this mesh to within other meshes. You can use this to make certain areas of one mesh print with different settings and with a whole different extruder." -msgstr "" +msgstr "이 메쉬의 볼륨을 다른 메쉬 내로 제한하십시오. 이 기능을 사용하면 다른 설정과 전체 압출기로 하나의 메쉬 인쇄 영역을 만들 수 있습니다. " #: fdmprinter.def.json msgctxt "mold_enabled label" @@ -3716,7 +3717,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_enabled description" msgid "Print models as a mold, which can be cast in order to get a model which resembles the models on the build plate." -msgstr "" +msgstr "모형을 모형으로 인쇄하여 모형에 모형과 유사한 모형을 만들 수 있습니다. " #: fdmprinter.def.json msgctxt "mold_width label" @@ -3726,7 +3727,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_width description" msgid "The minimal distance between the ouside of the mold and the outside of the model." -msgstr "" +msgstr "몰드의 바깥 쪽과 모델의 바깥 쪽 사이의 최소 거리입니다. " #: fdmprinter.def.json msgctxt "mold_roof_height label" @@ -3736,7 +3737,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_roof_height description" msgid "The height above horizontal parts in your model which to print mold." -msgstr "" +msgstr "모델의 수평 부분 위의 높이로 금형을 인쇄합니다. " #: fdmprinter.def.json msgctxt "mold_angle label" @@ -3746,7 +3747,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mold_angle description" msgid "The angle of overhang of the outer walls created for the mold. 0° will make the outer shell of the mold vertical, while 90° will make the outside of the model follow the contour of the model." -msgstr "" +msgstr "몰드에 대해 생성 된 외벽의 돌출 각도입니다. \"0\"도의 각은 금형의 외각을 수직으로 만들고 \"90\"도의 각은 모형의 외형을 모델의 외형으로 만듭니다. " #: fdmprinter.def.json msgctxt "support_mesh label" @@ -3756,7 +3757,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." -msgstr "" +msgstr "본 메시를 사용하여 지원 영역을 지정하십시오. 이것은 지원 구조를 생성하는 데 사용할 수 있습니다. " #: fdmprinter.def.json msgctxt "support_mesh_drop_down label" @@ -3766,7 +3767,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_mesh_drop_down description" msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh." -msgstr "" +msgstr "지지 메쉬 아래의 모든 부분을 지원하여지지 메쉬에 돌출이 없어야 합니다. " #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" @@ -3776,7 +3777,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "anti_overhang_mesh description" msgid "Use this mesh to specify where no part of the model should be detected as overhang. This can be used to remove unwanted support structure." -msgstr "" +msgstr "본 메쉬를 사용하여 모델에서 돌출부로 감지 할 부분을 지정합니다. 이것은 원하지 않는 지원 구조를 제거하는 데 사용될 수 있습니다. " #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode label" @@ -3786,7 +3787,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode description" msgid "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces." -msgstr "" +msgstr "모델을 표면 만, 볼륨 또는 느슨한 표면이있는 볼륨으로 취급하십시오. 일반 인쇄 모드는 동봉 된 볼륨 만 인쇄합니다. \"표면\"은 아무런 충전물없이 상단 / 하단 스킨없이 메쉬 표면을 추적하는 단일 벽을 인쇄합니다. \"둘 다\"는 정상 및 나머지 폴리곤과 같은 닫힌 볼륨을 서피스로 인쇄합니다. " #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode option normal" @@ -3811,7 +3812,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "magic_spiralize description" msgid "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid model into a single walled print with a solid bottom. This feature should only be enabled when each layer only contains a single part." -msgstr "" +msgstr "스파이럴 라이즈는 바깥 쪽 가장자리의 Z 이동을 부드럽게합니다. 이렇게하면 인쇄물 전체에 걸쳐 꾸준히 Z가 증가합니다. 이 기능은 솔리드 모델을 단단한 바닥이있는 단일 벽으로 인쇄합니다. 이 기능은 각 레이어에 단일 부품 만 포함되어있을 때만 활성화 해야 합니다. " #: fdmprinter.def.json msgctxt "smooth_spiralized_contours label" @@ -3821,7 +3822,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "smooth_spiralized_contours description" msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details." -msgstr "" +msgstr "나선형 윤곽선을 부드럽게하여 Z 솔기의 가시성을 줄이십시오 (Z- 솔기는 인쇄물에서는 거의 보이지 않지만 레이어 뷰에서는 여전히 보임). 매끄러움은 표면의 세부 묘사를 흐릿하게하는 경향이 있습니다. " #: fdmprinter.def.json msgctxt "experimental label" @@ -3831,7 +3832,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "experimental description" msgid "experimental!" -msgstr "" +msgstr "실험적인 " #: fdmprinter.def.json msgctxt "draft_shield_enabled label" @@ -3841,7 +3842,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "draft_shield_enabled description" msgid "This will create a wall around the model, which traps (hot) air and shields against exterior airflow. Especially useful for materials which warp easily." -msgstr "" +msgstr "이렇게하면 모델 주위에 벽이 생겨 외부 공기 흐름을 막아 (뜨거운) 공기와 차폐를 막을 수 있습니다. 왜곡이 쉬운 소재에 특히 유용합니다. " #: fdmprinter.def.json msgctxt "draft_shield_dist label" @@ -3851,7 +3852,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "draft_shield_dist description" msgid "Distance of the draft shield from the print, in the X/Y directions." -msgstr "" +msgstr "X / Y 방향으로 인쇄에서 드래프트 쉴드까지의 거리입니다. " #: fdmprinter.def.json msgctxt "draft_shield_height_limitation label" @@ -3861,7 +3862,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation description" msgid "Set the height of the draft shield. Choose to print the draft shield at the full height of the model or at a limited height." -msgstr "" +msgstr "드래프트 쉴드의 높이를 설정하십시오. 모델의 전체 높이 또는 제한된 높이에서 드래프트 쉴드를 인쇄하도록 선택하십시오. " #: fdmprinter.def.json msgctxt "draft_shield_height_limitation option full" @@ -3881,7 +3882,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "draft_shield_height description" msgid "Height limitation of the draft shield. Above this height no draft shield will be printed." -msgstr "" +msgstr "드래프트 쉴드의 높이 제한. 이 높이 이상에서는 드래프트 쉴드가 인쇄되지 않습니다. " #: fdmprinter.def.json msgctxt "conical_overhang_enabled label" @@ -3891,7 +3892,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "conical_overhang_enabled description" msgid "Change the geometry of the printed model such that minimal support is required. Steep overhangs will become shallow overhangs. Overhanging areas will drop down to become more vertical." -msgstr "" +msgstr "최소 지원이 필요하도록 인쇄 된 모델의 형상을 변경하십시오. 가파른 오버행은 얕은 오버행이됩니다. 오버행 영역이 더 수직으로 떨어집니다. " #: fdmprinter.def.json msgctxt "conical_overhang_angle label" @@ -3901,7 +3902,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "conical_overhang_angle description" msgid "The maximum angle of overhangs after the they have been made printable. At a value of 0° all overhangs are replaced by a piece of model connected to the build plate, 90° will not change the model in any way." -msgstr "" +msgstr "오버행 각도가 인쇄 가능하게 된 후 최대 각도. \"0\"도 각의 값에서 모든 오버행은 빌드 플레이트에 연결된 모델로 대체됩니다. \"90\"도 각은 모델을 변경하지 않습니다. " #: fdmprinter.def.json msgctxt "coasting_enable label" @@ -3911,7 +3912,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "coasting_enable description" msgid "Coasting replaces the last part of an extrusion path with a travel path. The oozed material is used to print the last piece of the extrusion path in order to reduce stringing." -msgstr "" +msgstr "코스팅(Coasting)은 돌출 경로의 마지막 부분을 이동 경로로 바꿉니다. 누출 된 재료는 스트링을 줄이기 위해 압출 경로의 마지막 부분을 인쇄하는 데 사용됩니다. " #: fdmprinter.def.json msgctxt "coasting_volume label" @@ -3921,7 +3922,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "coasting_volume description" msgid "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed." -msgstr "" +msgstr "그렇지 않으면 볼륨이 흘러 나옵니다. 이 값은 일반적으로 노즐 직경 입방체에 가깝습니다. " #: fdmprinter.def.json msgctxt "coasting_min_volume label" @@ -3931,7 +3932,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "coasting_min_volume description" msgid "The smallest volume an extrusion path should have before allowing coasting. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume." -msgstr "" +msgstr "코스팅(Coasting)을 허용하기 전에 압출 경로에 있어야하는 최소 볼륨. 작은 압출 경로의 경우 보우 덴 튜브에 가해지는 압력이 적기 때문에 연안 부피가 선형 적으로 조정됩니다. 이 값은 항상 Coasting Volume보다 커야합니다. " #: fdmprinter.def.json msgctxt "coasting_speed label" @@ -3941,7 +3942,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "coasting_speed description" msgid "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops." -msgstr "" +msgstr "코스팅(Coasting) 시, 이동 속도. 돌출 경로의 속도에 상대적입니다. 해안 이동 중에 보우 덴 튜브의 압력이 떨어지기 때문에 100 %보다 약간 작은 값을 권합니다. " #: fdmprinter.def.json msgctxt "skin_outline_count label" @@ -3951,7 +3952,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." -msgstr "" +msgstr "위쪽 / 아래쪽 패턴의 가장 바깥 쪽 부분을 여러 동심 선으로 바꿉니다. 하나 또는 두 개의 선을 사용하면 충진재로 시작하는 지붕이 향상됩니다. " #: fdmprinter.def.json msgctxt "skin_alternate_rotation label" @@ -3961,7 +3962,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "skin_alternate_rotation description" msgid "Alternate the direction in which the top/bottom layers are printed. Normally they are printed diagonally only. This setting adds the X-only and Y-only directions." -msgstr "" +msgstr "위쪽 / 아래쪽 레이어가 인쇄되는 방향을 바꿉니다. 보통 대각선으로 만 인쇄됩니다. 이 설정은 X 전용 및 Y 전용 방향을 추가합니다. " #: fdmprinter.def.json msgctxt "support_conical_enabled label" @@ -3971,7 +3972,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_conical_enabled description" msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang." -msgstr "" +msgstr "실험적 기능 : 오버행보다 하단에서 지원 영역을 작게 만듭니다. " #: fdmprinter.def.json msgctxt "support_conical_angle label" @@ -3981,7 +3982,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_conical_angle description" msgid "The angle of the tilt of conical support. With 0 degrees being vertical, and 90 degrees being horizontal. Smaller angles cause the support to be more sturdy, but consist of more material. Negative angles cause the base of the support to be wider than the top." -msgstr "" +msgstr "원추형 지지점의 기울기 각도입니다. \"0\"도가 수직이고 \"90\"도가 수평입니다. 각도가 작 으면 지지대가 더 튼튼 해지지 만 더 많은 재질로 구성됩니다. 음수 각도는 받침대의 받침대가 상단보다 넓게 만듭니다. " #: fdmprinter.def.json msgctxt "support_conical_min_width label" @@ -3991,7 +3992,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_conical_min_width description" msgid "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures." -msgstr "" +msgstr "원추형지지 영역의베이스가 축소되는 최소 너비. 폭이 좁 으면 불안정한지지 구조가 생길 수 있습니다. " #: fdmprinter.def.json msgctxt "infill_hollow label" @@ -4001,7 +4002,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_hollow description" msgid "Remove all infill and make the inside of the object eligible for support." -msgstr "" +msgstr "모든 충진재를 제거하고 물체의 내부를 지탱할 수있게하십시오. " #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled label" @@ -4011,7 +4012,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled description" msgid "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look." -msgstr "" +msgstr "외벽을 인쇄하는 동안 무작위로 지터가 발생하여 표면이 거칠고 흐릿 해 보입니다. " #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness label" @@ -4021,7 +4022,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness description" msgid "The width within which to jitter. It's advised to keep this below the outer wall width, since the inner walls are unaltered." -msgstr "" +msgstr "지터가 발생할 너비. 내벽이 변경되지 않으므로이를 외벽 너비 아래로 유지하는 것이 좋습니다. " #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density label" @@ -4031,7 +4032,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density description" msgid "The average density of points introduced on each polygon in a layer. Note that the original points of the polygon are discarded, so a low density results in a reduction of the resolution." -msgstr "" +msgstr "레이어의 각 다각형에 도입 된 점의 평균 밀도입니다. 다각형의 원래 점은 버려지므로 밀도가 낮으면 해상도가 감소합니다. " #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist label" @@ -4041,7 +4042,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." -msgstr "" +msgstr "각 선분에 도입 된 임의의 점 사이의 평균 거리입니다. 다각형의 원래 점은 버려 지므로 높은 부드러움으로 인해 해상도가 감소합니다. 이 값은 퍼지 스킨 두께의 절반보다 커야합니다. " #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4051,7 +4052,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_enabled description" msgid "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines." -msgstr "" +msgstr "얇은 공기 중에서 인쇄하는 스파 스 웨브 구조로 외부 표면 만 인쇄하십시오. 이것은 상향 및 대각선 방향으로 연결되어있는 주어진 Z 간격으로 모델의 윤곽을 수평으로 인쇄함으로써 실현됩니다. " #: fdmprinter.def.json msgctxt "wireframe_height label" @@ -4061,7 +4062,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_height description" msgid "The height of the upward and diagonally downward lines between two horizontal parts. This determines the overall density of the net structure. Only applies to Wire Printing." -msgstr "" +msgstr "두 개의 수평 부분 사이의 상향 및 대각선 방향의 높이입니다. 이것은 네트 구조의 전체 밀도를 결정합니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_roof_inset label" @@ -4071,7 +4072,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_roof_inset description" msgid "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing." -msgstr "" +msgstr "지붕에서 연결을 할 때 안쪽까지 윤곽선을 그립니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_printspeed label" @@ -4081,7 +4082,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_printspeed description" msgid "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing." -msgstr "" +msgstr "재료를 압출 할 때 노즐이 움직이는 속도. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom label" @@ -4091,7 +4092,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom description" msgid "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing." -msgstr "" +msgstr "빌드 플랫폼을 만지는 유일한 레이어 인 첫 번째 레이어 인쇄 속도. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_printspeed_up label" @@ -4101,7 +4102,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_printspeed_up description" msgid "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." -msgstr "" +msgstr "얇은 공기 속에서 위쪽으로 선을 인쇄하는 속도. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_printspeed_down label" @@ -4111,7 +4112,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_printspeed_down description" msgid "Speed of printing a line diagonally downward. Only applies to Wire Printing." -msgstr "" +msgstr "대각선 방향으로 선을 인쇄하는 속도. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat label" @@ -4121,7 +4122,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat description" msgid "Speed of printing the horizontal contours of the model. Only applies to Wire Printing." -msgstr "" +msgstr "모델의 수평 윤곽 인쇄 속도입니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_flow label" @@ -4131,7 +4132,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_flow description" msgid "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing." -msgstr "" +msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_flow_connection label" @@ -4141,7 +4142,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_flow_connection description" msgid "Flow compensation when going up or down. Only applies to Wire Printing." -msgstr "" +msgstr "위 또는 아래로 이동할 때 유량 보정. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_flow_flat label" @@ -4151,7 +4152,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_flow_flat description" msgid "Flow compensation when printing flat lines. Only applies to Wire Printing." -msgstr "" +msgstr "평평한 선을 인쇄 할 때 유량 보정. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_top_delay label" @@ -4161,7 +4162,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_top_delay description" msgid "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing." -msgstr "" +msgstr "상향 라인이 강화 될 수 있도록 상향 이동 후 지연 시간. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_bottom_delay label" @@ -4171,7 +4172,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_bottom_delay description" msgid "Delay time after a downward move. Only applies to Wire Printing." -msgstr "" +msgstr "하강 후 지연 시간. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_flat_delay label" @@ -4181,7 +4182,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_flat_delay description" msgid "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing." -msgstr "" +msgstr "두 개의 수평 세그먼트 사이의 지연 시간. 이러한 지연을 도입하면 연결 지점에서 이전 레이어와의 접착력이 향상 될 수 있으며 너무 긴 지연으로 인해 처짐이 발생할 수 있습니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_up_half_speed label" @@ -4193,7 +4194,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" +msgstr "기본 속도의 반으로 돌출 된 상향 이동 거리. 이로 인해 이전 레이어에 더 나은 접착력을 유발할 수 있지만 레이어에있는 소재는 너무 많이 가열하지 않습니다. 와이어 인쇄에만 적용됩니다." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4203,7 +4204,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_top_jump description" msgid "Creates a small knot at the top of an upward line, so that the consecutive horizontal layer has a better chance to connect to it. Only applies to Wire Printing." -msgstr "" +msgstr "상향 선의 상단에 작은 매듭을 만들어 연속적인 수평 레이어에 연결할 수있는 기회를 얻습니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_fall_down label" @@ -4213,7 +4214,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_fall_down description" msgid "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing." -msgstr "" +msgstr "위쪽으로 밀어 낸 후 재료가 떨어지는 거리. 이 거리는 보상됩니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_drag_along label" @@ -4223,7 +4224,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_drag_along description" msgid "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing." -msgstr "" +msgstr "대각선 방향으로 돌출 된 돌출부의 재료가 위쪽으로 밀어내는 거리. 이 거리는 보상됩니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_strategy label" @@ -4233,7 +4234,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_strategy description" msgid "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted." -msgstr "" +msgstr "각 연결 지점에서 두 개의 연속 된 레이어가 연결되도록하는 전략입니다. 후퇴를하면 상향 선이 올바른 위치에서 경화되지만 필라멘트 연삭이 발생할 수 있습니다. 상향 선의 끝에 매듭을 만들어 연결 기회를 높이고 선을 차게 할 수 있습니다. 그러나 느린 인쇄 속도가 필요할 수 있습니다. 또 다른 전략은 상향 라인의 윗부분의 처짐을 보충하는 것입니다. 그러나 선은 항상 예측대로 떨어지지는 않습니다. " #: fdmprinter.def.json msgctxt "wireframe_strategy option compensate" @@ -4258,7 +4259,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_straight_before_down description" msgid "Percentage of a diagonally downward line which is covered by a horizontal line piece. This can prevent sagging of the top most point of upward lines. Only applies to Wire Printing." -msgstr "" +msgstr "수평선 조각에 의해 덮여있는 비스듬히 하향 선의 백분율. 이렇게하면 상향 선의 맨 위 지점이 처지는 것을 방지 할 수 있습니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down label" @@ -4268,7 +4269,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down description" msgid "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing." -msgstr "" +msgstr "수평 지붕 라인이 '얇은 공기 안에'인쇄 된 거리는 인쇄 될 때 떨어집니다. 이 거리는 보상됩니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along label" @@ -4278,7 +4279,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along description" msgid "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing." -msgstr "" +msgstr "루프의 외곽 윤곽으로 돌아갈 때 끌린 내향 선의 끝 부분 거리. 이 거리는 보상됩니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay label" @@ -4288,7 +4289,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay description" msgid "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing." -msgstr "" +msgstr "지붕이 될 구멍의 바깥 둘레에서 보낸 시간. 긴 시간은 더 나은 연결을 보장 할 수 있습니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance label" @@ -4298,7 +4299,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." -msgstr "" +msgstr "노즐과 수평 아래쪽 라인 사이의 거리. 클리어런스가 클수록 비스듬한 각도에서 비스듬히 아래쪽으로 선이 그어져 다음 층과의 연결이보다 적어집니다. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "command_line_settings label" @@ -4308,7 +4309,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "command_line_settings description" msgid "Settings which are only used if CuraEngine isn't called from the Cura frontend." -msgstr "" +msgstr "큐라(Cura) 프론트 엔드에서 큐라엔진(CuraEngine)이 호출되지 않은 경우에만 사용되는 설정입니다. " #: fdmprinter.def.json msgctxt "center_object label" @@ -4318,7 +4319,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "center_object description" msgid "Whether to center the object on the middle of the build platform (0,0), instead of using the coordinate system in which the object was saved." -msgstr "" +msgstr "객체가 저장된 좌표계를 사용하는 대신 빌드 플랫폼 중간, (0,0)에 객체를 중심에 맞출어야 할지의 여부 " #: fdmprinter.def.json msgctxt "mesh_position_x label" @@ -4328,7 +4329,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mesh_position_x description" msgid "Offset applied to the object in the x direction." -msgstr "" +msgstr "x 방향으로 객체에 적용된 오프셋입니다. " #: fdmprinter.def.json msgctxt "mesh_position_y label" @@ -4338,7 +4339,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mesh_position_y description" msgid "Offset applied to the object in the y direction." -msgstr "" +msgstr "y 방향으로 객체에 적용된 오프셋입니다. " #: fdmprinter.def.json msgctxt "mesh_position_z label" @@ -4348,7 +4349,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "mesh_position_z description" msgid "Offset applied to the object in the z direction. With this you can perform what was used to be called 'Object Sink'." -msgstr "" +msgstr "z 방향으로 객체에 적용된 오프셋입니다. 이것을 사용하여 '오프젝 싱크(Object Sink)'라고 불렀던 것을 수행 할 수 있습니다. " #: fdmprinter.def.json msgctxt "mesh_rotation_matrix label" @@ -4358,4 +4359,4 @@ msgstr "" #: fdmprinter.def.json msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." -msgstr "" +msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬입니다. " From 8c9d051479df024a34c4b6c57c8a5885ca55a8e9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 16:42:47 +0200 Subject: [PATCH 095/379] Re-enable Korean translations They are complete now, as far as we agreed on (only the setting descriptions). They may now be re-enabled. Contributes to issue CURA-3950. --- resources/qml/Preferences/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 4abb7942bc..7168aa78a8 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -153,7 +153,7 @@ UM.PreferencesPage append({ text: "Français", code: "fr" }) append({ text: "Italiano", code: "it" }) append({ text: "日本語", code: "jp" }) - //append({ text: "한국어", code: "ko" }) + append({ text: "한국어", code: "ko" }) append({ text: "Nederlands", code: "nl" }) append({ text: "Português do Brasil", code: "ptbr" }) append({ text: "Русский", code: "ru" }) From 7386b0bcedb6b07188f929207a928ef380e35f4b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 23 Jun 2017 16:50:36 +0200 Subject: [PATCH 096/379] Remove translation for Material category It looks very wierd to have the Material category label translated but not the rest of the categories. I don't know the proper translations for the rest, so I must remove this one. The label is left intact though. Contributes to issue CURA-3950. --- resources/i18n/ko/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/ko/fdmprinter.def.json.po b/resources/i18n/ko/fdmprinter.def.json.po index bf3fb5159c..d430226aa4 100644 --- a/resources/i18n/ko/fdmprinter.def.json.po +++ b/resources/i18n/ko/fdmprinter.def.json.po @@ -1325,7 +1325,7 @@ msgstr "이보다 좁은 스킨 영역은 확장되지 않습니다. 이렇게 #: fdmprinter.def.json msgctxt "material label" msgid "Material" -msgstr "재료 " +msgstr "" #: fdmprinter.def.json msgctxt "material description" From 49e53c2cda41986a1b0fa204a7b2dc30617c51dd Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 23 Jun 2017 17:25:53 +0200 Subject: [PATCH 097/379] Revert "dark layer view" This reverts commit 67a4ec2a9e56ba6df31fa06efe49a69aa1b2d20f. --- resources/themes/cura-dark/theme.json | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 89f12cc772..5855b59d04 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -181,19 +181,6 @@ "convex_hull": [35, 35, 35, 127], "disallowed_area": [0, 0, 0, 40], - "error_area": [255, 0, 0, 127], - - "layerview_ghost": [32, 32, 32, 96], - "layerview_none": [255, 255, 255, 255], - "layerview_inset_0": [155, 0, 0, 255], - "layerview_inset_x": [0, 155, 0, 255], - "layerview_skin": [155, 155, 0, 255], - "layerview_support": [0, 155, 155, 255], - "layerview_skirt": [0, 155, 155, 255], - "layerview_infill": [155, 117, 0, 255], - "layerview_support_infill": [0, 155, 155, 255], - "layerview_move_combing": [0, 0, 155, 255], - "layerview_move_retraction": [77, 77, 155, 255], - "layerview_support_interface": [39, 117, 155, 255] + "error_area": [255, 0, 0, 127] } } From f7a1c8dbb20243fb465fb84be8726b6bc6a4810e Mon Sep 17 00:00:00 2001 From: Cyrille Meichel Date: Mon, 26 Jun 2017 01:02:52 +0200 Subject: [PATCH 098/379] Add DiscoEasy printer (dagoma.fr) --- .../definitions/dagoma_discoeasy200.def.json | 60 ++++++++++++++++++ resources/meshes/discoeasy200.stl | Bin 0 -> 1751784 bytes 2 files changed, 60 insertions(+) create mode 100755 resources/definitions/dagoma_discoeasy200.def.json create mode 100644 resources/meshes/discoeasy200.stl diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json new file mode 100755 index 0000000000..cc0dca2918 --- /dev/null +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -0,0 +1,60 @@ +{ + "id": "Dagoma_discoeasy200", + "name": "Dagoma DiscoEasy200", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Dagoma", + "manufacturer": "Dagoma", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "discoeasy200.stl", + "platform_offset": [ 105, -59, 280] + }, + "overrides": { + "machine_width": { + "default_value": 211 + }, + "machine_height": { + "default_value": 205 + }, + "machine_depth": { + "default_value": 211 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [16, 37], + [16, -65], + [-16, -65], + [16, 37] + ] + }, + "machine_nozzle_gantry_distance": { + "default_value": 55 + }, + "machine_nozzle_offset_x_1": { + "default_value": 18 + }, + "machine_nozzle_offset_y_1": { + "default_value": 0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "machine_start_gcode": { + "default_value": ";Gcode by Cura-by-dagoma for DiscoEASY200 V2.6\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{print_temperature}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{print_temperature}\nM140 S{material_bed_temperature}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F3000\n" + }, + "machine_end_gcode": { + "default_value": "\nM104 S0\nM106 S255 ;start fan full power\nM140 S0 ;heated bed heater off (if you have it)\n;Home machine\nG91 ;relative positioning\nG1 E-1 F{retraction_speed} ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+3 F3000 ;move Z up a bit and retract filament even more\nG90\nG28 X Y\n;Ventilation forcee\nM107 ;stop fan\n;Shut down motor\nM84 ;shut down motors\n" + } + } +} + diff --git a/resources/meshes/discoeasy200.stl b/resources/meshes/discoeasy200.stl new file mode 100644 index 0000000000000000000000000000000000000000..f23051230327be45b412989dd3fa9e27d92b3ab8 GIT binary patch literal 1751784 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�Bw`flj zG83k^?NKFjYI@V(5x$HcNXUGL_D(=r6R48e679SYA}q#Zl+3SazXVhvt!*G7^Euk9 z0clO3O6G>NYea|$ypmt2ecb&N&tz!id~YCM<5Jq$NJ|J!tqAG#1gT{1OFLndj=+2% zt!>Da7rlQjs}c0BzRcU{&2mkkbtE$990{5A)4Q)oI~%^#IjYc;5MeQn61ldd_vKNA z`O`L#khLCqvlwYjpi0)6=uPGj5qKr*SF{HJs*u(;kdSpT+H(MDO`uBFm zH`bAMHUa`wSPCJ+m$;Jk9om@!RakD?1`@KKMEh4Dtq6mvR|oMr!#zJfoSE>Ekn3~W z{Q_xa!$*}|-P67XAtK1RtQyb`3#dX`+dx9rHE4GSq!nRMwR8{XoZd3cOsv?&SJ-)iemevrD=ctmEf7%T*Lm>A@}QO7fGZwfhxIINc)S1 zh`=kk2TA*uq6%qk1Bp7jf_AQGMVNFdtijN=vyX(_Kc)Tp#6zN$4Ifn)l^F>mPXf{I zowDvjo)o9&=4l&9$dfL#TWB$nvIgLz>W8iTtU--VFO@)SZN_)m|GIT`kX!O|3|lj*Ozy`pGMplWD&_T;vvt1}Zup4g&2KBW#Q zA9!`IY$yUt6lqPM3d^T-1m**2Wy7D_o^wk(=;C>?o)lq_=+uwta=TV3S`(;}rygkM zVYH_RU!Ieo9duEJv?5G8;>11ADOwS}oR?JC!^!bbt2J03@?@@VUC9>ZOYEj6*5x6s zyfVeVtjm)pbIC^W@l+edzaW9>ly+{4&$}*9p3Eg1#m7@^6#s$*rc-ScpLboJJef;2 zijSw-DEWQG7hrM)5C5U^>-C z@p;$f$uq((A7IZ#Nf1}*2~F#`Dn9Qz*bjNGvZn}N-j%pw|3k4Vr;gm@-j$g6a7>QV z6@d0?b@v`lb%)(K@ZuNFc4<=0*jm@6!)r1~H2$=6Kp?HWGN>v@v~@%+vq#y}MEUct z4$dpSQ=TLpsp zx1}TM<@IwmI;Sfu$%l_BtOK;Cyz+7HacqwrCyx#CqzHoq)(z5{Kvi)X+j+_y&J?TG z<;nY;dUyQP{t8v{HYn{qUwo!i;;;LLyBzkgB`T`V*Pj!cHuze1Jk&GzxRZ_$^e%uz zBE3nVbB@I7SO<6B%65+>q&1OFMR#>eM>KluN@oL!@IB#lD(Z2>M#;qUEjikI)m|PD z;r1UW}y&H~Ok z65-fQr=nIQHcBQ=JD+WIx_5a%gxa7#U;x*7p0`Yu?g!s-ZEkO!TpbK@e%E_^-WN|^ zq0Wo;Tv2oW~>+{3*$sf>G0 zJMy1-u@z4q?b77Qs%3nj;b2Jmv{EOOG+XxUeBuAkJT!qwGAXTOl5l9ee+823RQD_CMf5b^D%K#UFZ9> zSoh#PYKqq%Yt?hd|M;|b>Nq%^Kl0dm+Y>MyB@l%( zn0WEfvx;_QC0-e{j`lLz@R5-6p?n~%>jPC-Rv{wr3JEDuvVpX=fhtL-)=g&O?zz=m zNuSVQQMd*z#ytb7_8wc^5q}?gCNtstH*ybm#sy1Noj-UiAD_HoSxOBe(S19s3bI~Q zw9AJtarN=BwVfyX2Q61Bj5nQgBu*I4^ySB|P_!mcb<^ie&kJEQwd)8FIQdao5Y8gBBIaM{sX~ei52_PHBTgYp+oCR9EgF zOC~nl&argN&W^Ex?KmC(sCn$8uQ>hO9UZj|zuq{mwX>oPf_kPk%NLL0&-Tv znAt8M!exaj>>0#Hn2=w{`qgu}4ziv*Io5j)&wXmHJSC+*kdU^LO1qo~`9Rg(t2uU; zbg!Z8WhSsML0S?1;cD#f<-OagddB)!gh66jYo>=+$x*Z>P<8h}CMuqum6`DC%u0GS zpp{Y~t!*ID^b4k+{k?^vHGwK@gV?$>k-v%C#J*Lvf>@#&4Ar?Wk%+`2&6r-(w4S1! zjetPa^{>`&{dwaB4a0=RINGm$kX6@BYNS+1Ya2*h-HhqiA3ICYnm`q{ZH#G01YTWT zz`3QCgMC!%YTQ8NOJ169~RqCHIvdWj?B?txumXfNcIFQtpb z(|wt~Z|IeZ);3VpcrE9n!wK4+BLW*pjI78uez?773~5cIQ@!-(Rbj$n93}X!9X@M< zPbX;`=?IE;q#Y61kY7k8eHYyymgB*5GQM~vzaW9>fCy~Jc}XSFM=CiU5P=Q(1qnfVB9*qMcYhpLa$e_2@DvI@CzHI3>`R@eBU0(4iDc}`S~00)Ri1p8<7x7d^aKe^ zhY2|^sqikl91jTV8s}VoAwuq-(w%Cgbv`~_^S3K^>Jzb~s}J7ej)&*%>4;QX+mQ2; zN|ki7&dFOx_>zxwL@KRq$a$S7P||WdY(suQ0@DFu4RPs8-I5ART8;-qaXylsAc5(C z2yDoCNrg2i#{(j;A-^DjX{vvFdYcK!hn$yG_zZ&_4+w(j4zGXNpSxT%(0!G=W`5<; zGi%L@$#F_so%`dml3$3xl15q+sFE~YM`t8_QBgj+-utcdYVD8L2lhhO=RT?=#z-Y+ z3K0g0r@Q?a*g#t6Bb|yoEFB@VyMvW%A4I3Oky^T9BOrXKb3Cu)DV26M0s>W%#?lRJ zSd8mj;)hmJBq}jYPrx`EX$hgJ4vuzqu;tCBlT9msIK6d6;306AhMgZ&#*GT+uobQMK%A zCbs3QOHag!W$O{on8;a@{^dxgya(odV@sEh2R0nR?JnXKx4Ve<)r|{d+?x5gCWil9 z#+{4m_KyGlm7w!J@Z90NhYvS&X;tUWM(sHtIfBm1BN^L}<5X_i#ua56*lWOuN72AD zStf2fkB?LIWF{{E;#5ahUOY$9nrM0rtEi6>8|3?qFZ1zRwq4COd>e_B4*>_KU43$LU66;qI#|tJ`j;RnCal_xH{*w9)QdKE5{r z?>jr9^H%ovt*2%M`Jj@HediP_!n}si>@^+{j*LLg*biHv~jDN>GJ$ zAU47TmME50#?tkXX!`-z!7(TFR3)wQ;iC%c0PQKlT)X}ZSA$e0cfQK$g#`bx=4IhgXxtQEK{_$kjr_TkELFFcOUNSMR8PiCFBN0{De~67R z(K*>VU-?iaVC8dd3*jULmpJLGGhQwqK!WO`uBZfIP_@ zB}i=T&o+whbEYd@RAH^5J?+)1rd+oh22GD83b_;>ZZtdg(0y!=j%Ox>zWm-N6zvFK zO1DMjGhON4-E4M{TZ%r(dANr|VpSEU+dZM_6t6&awKUJOBX%VHjr3( z58I$;ypUEld{n)>m5B;%OCXYOxJ5jwsYiEnpV;iyzOmQqb4kBdB{^rXhPW5Sx*hc* z6X$33RJ8KS44=&Xxqs!uDwZ%7G7}H1=h$7f<`G3}0#z8{82OIyB_Br)v+rBW&Qr03 zF{W)GG3r~U>t6AUqBVgk97UxJL$T{`F30Cx_iC5myi_+&Cr8vawUSd6dkMn1zmXTyba zVhxsay4~kbWgb7wlrpUP<8S+%c5?neGXNY*lvh3yYnn0bPtdd`P&K(X6JLEkSJ_j9 zX}E?}SqGm~D$J82d?ZF~V0!0=vlXogRN~A@SryrhD$6u4ru|or-df-fH5n1xL9O zrS&99ceBr)7Yr*K9M{B^yUMv=_E(%0`*tg*i8$kZP9Hbq@swFcI)dyW?QHlGSLrwKW<{_8lmgCCw5*eIE(vWjiAuQ4lzw9W^rM!m*_-}K2a zVKHtW*Y7`o+cj9C{6?NEHU;0EOUj2jV34hK}v?fr6 zEjV-g;P>Dn9=-L4Dr{Za1`_;69mg)xjrEk$BGQx)d}~Wg*AwWj(G`@rrS*2p@^#oA4Ob_TA2k)sZR6;p z37j)vZn2kegfDT0#QVSTT;%#DPln4XAW(&Ih4!>pV=hRJ!rS!tfhDa7gGA?RnSP<| zoUm6G+e%N-M9-FCQnb z&ti*}jb=@Zi~KuQz?+lqPQ#}4JnFys{GuSYR6b~1+dyLOK&Fuhm99Y*&R)bum`Ilo zQenAiuaNkuFPB1>$g=?vwt*_Vt`!?$qW%J|gYOnS8|&AZ)5CsU9K*WNUUj+f7+3B+ z&wVlQgzCBL-F*D%Pm=Gx`cmh26;yS^m>Ek{WRz`1Z)!%ohpML5AQEevF@55YWs25b zq3XF=ylU|E3-S(cy1RW_F5i$`AFNGn1Bw4EVw&#oW-eV+VLgY4z^iKy@GNZE)i0_x zfo(;5g+$>jrt1t`s%TB13d<*R8${yQrfeg+qon#kRgVPEkjrk@^{>79aR-mcUoLts z_U7}PcKyd7PS;+&C?!gesQpSYq3EO$9t}`6Vg(c5p0QBdQv{aJ@XAaq81q7`*K(fK zyz&~ndGAI8B(U#7TIU>9269_EVs-^?AMaJO&))#8ZJ-LvEkyXzi$33uYwdR1J}^&M zo7x5vtEw7G$1`@xt z<9g0*J4(@-K-Ge2Oq^f$rV@x2Z?dYwf$4#Y>Uq}=K2BFl&W7Z}AaUPZR?V$GOVOH8 zDu`F9^H5y*H4FK?@9n=MI4{*R=1J!qiE2sT2R?eAqBW6DMV^RPp|~fj7t#ghle!e~8r6nxJ zy{K5HSusA@EypKpUCmJvDoWak!5Bn+}YrBurfA`#20)bD&Bkl4LlrE}%-SDCF z@V6T8#!5#BP5D4Ny$w?JIDUt-vHrwuB@j}IM4Zx>-cX2m_r1F*TvonB$=6@(bgGxU zw^Zq3scWy0$ZN!O^>el=S`(-mcjjl#-o0PEQv%WX4bJVsDH~PnW~@OUi50Crb~e20 zG_AbyQPp)e6Yn-IfiRa>=k|Q{^J|q?U+($D*;_VXosKIXiII(%zH{=ciq>AC3R^11 zv?ioy7`bzG&{C;&$#F_M!k0RiUx?uMSR!8Wdn^$zOrQ#53|q7E${@k-%|twUy9Q}Z zpbBF*Log+2i;;DZ#&PWKWWr8c-k$wLROZ7EYb0R2%;}%N^hF%ALACd?Y@3g6YQl#wc2Qg{osuJjb2)wBLqiCQSM9 ztorottCb3AZ3BrPj^k3;+qRFQHGwKDH+jx7Tvj)&=Q3IQc12zTIU>94L5TAZ`-u71fs^}=et!QwqihRe&S2lbko_>vK z>QOW1+(*^#W7;}m(*N<1kkk$mM z(5uYEKMO~@9MVn^H5UEqZ0tF*EpN1;FM~zAdFH)5Z3BtvU)}16R9X|L!d)ZKUS`5S zwTrVsZ&x6#2~=T8XC@>cHkW60+fCm@ig=WkPUf~FN;=YKpah!ij ze&(?jiDS*Z$v*M2e5ADvRP~#7sk3pCwGkqMoFgH1L-PcrwGCADxPt4M<_x7HgeC&% z^fpNK>ZD;VALUjpDbzQE=WR$U8$PNeN@$)CB7AA*>4-Jf2GY)k5JBHgs;sxhJFnhIM_7#el2c#) z*{R%`rQ4m5-@;wgiS~z!c)_k*0l_=R@m^uPj~lOr^1g8qFT7V65g^U_{nNV|N9 z4gb&9f3WX%AFt&fahmq=s=4=fcRak0*Q?+E<$j@kyhiw}qC8y`p3G~9=ZB}J1_OS8+ve>_6n0{ zyy&>I;Y<6dcltk$puNIGMI*ze+WXz{@Lpj^jHtEGsc5e-q_vH7o{$Y809Q3R*ri(+A9ocO`r-rDIL*yG557}Zxd;4165dSnTbZ1 z^9VqDf<=eyb)`Uih3!1Z_QHFGAt7nnDFkWfl`o}xM#Y2fytG%Cf zv3Cp8v{x9?x&~2&r5hrobbTc1{lhlsO>d-?4IfqY?&R2|y}~jRk43pZr`^7!M5)$# zEav`^cAZi=H%NS)V48LpLs}E4y5vl*LE3{XL|BY_>id7=5rB3V!|224Q8_nAY`>bL zopu*PS`(^iv?fr6<8FuuygKDLE>YUY z3(IHB)qFg>j~5c_A7ig*A1|b}SE$M_!vyW)m67oGBxeA$x0(1(ah3HP*KE);1o=SX zqP;wSpdHhYc3uSpsxV$dgvDH3`6o@}GNIkYP=!&cZ6Glyo-9$jyBN}%K-JlwGeNtH zg^0kb$G&70?JkBYq_qtsR=&qH?JkD2CQya779zwegT&nn*aqz`hP1O05U9fF3lYB5 zN8{n#JJarB*gJ>%#J~m;E$(BQb{9ihdxff&XYdF>yNi{MXupDO(C%VLYa6Kg`Fkd4 zcd-y5IX7>0;r^9&7sK+w)}?JA@nTJ;=iA-Ikk$mMuz$=*_%qJqo|ASLJJOERw7Xcw z@xyHXg-03MT?|z?`Y5k_B+l*3voqRV3~5cEDn5q^+FdLoVgBvOzSHhvsKPvH8%R7l zh-ung3~5cE3df9$gfSnn@3gxZsxVL51`_`%&tB2)Vn}NORal#u3G9)jH=uQ&l?}P4 zrai=*4PVB=bOiP1NNca;7gEU^17t&vQ(D`QUx>gxAdprz461N{u*?Kr@ya}!?BVK; zvf(3vYZ*u@!lYACZZi@-68!ZU-uX?4pscJR9@S7K<%TvwghAq;N*q_T#~RWuAHLK% zsxUG#6Z~z-h(}-5lwIVgborZ_5s$vYsmdz(eNO&G2=bl3mS)25&oAQ9 zSO1(>K|c6voA!C?;G3LW(){Jch(}-ERQWJS@b~T_Uh(%pnbriV_^WvAJJypXq$i_D zlr+UFzE`LSUsOb-E2~hn`>5h?bw<46Z-B!7iPjL8E`K#N;uU{qlvPM;uaMv`7TOha z`!!PWHtZFu_Ad3aK1MwH)+e49V?ld`1b;O&;?Y+_k=6vNq?aJyLxeA7 zg#>^1Gvd)#Ly>ki0s>Xo4`wF#+nEus_zRmHeVKa(B=}pM5%2Qg>z?Ui7ghY-&xlw2 z)leXUeDHThBVO^>NLhun%enoJ;|dA>uBr7Z_!27E2nbYROU>M(_-mW?Er{UzoE%FS zW6CQZ3I2+webzbn256c{^ihR9PAEzwA3lFuGUCx!Bl&BR5wG~0lM#=;Sn0g-rL6dC zn-Q=0o1EO2U>~FMVUXajZ8Cv9ktR^Z-{iEhYrhm)I)cB|8S&`ro=9sOm|L_bB@*P^ zVlGO2B=}pM_T9eV8=z@M10PlB724BY)gMG(3g!1zq}FKlT-soGO&r9H}!BCiemQ`a0hYeR2|~x3+mUDBZAE zSh_RUaNVq$wq=Hp}OTeuN#|Dff8CsfZT z4CmvQAD{Xr5)uzBVH^FL>2I@W8>m7LGshJYclBT!<)$x*A+2qo3UeMJeCbR48|iEB z5$}u(^p|0}Z|CC$SuduPE)owO%c{v6O3FE^{(hXko*nTr;d<0&liwtao;V403 z_gNfQ1729HYEzdLsxY^q`Ut!lP?deJmcK%s7xScTAaT>@97}ZPCuGB7JPx7?qc1ao zb85T_!}+!ID#!;CW#@68sBI&y2~>$EX^9{oNL;d)ZEQNIziOs!pz4mn99NY#cMZxa z-1|)2#Hwkr?n;HUwt>WtwKz)t__Vj8HG!(PM>BELwgDv&pVqDKBK(~O_U_vkoThjk z(w@^l+WoMd4f`M0ITH0hV;jF!ou_C`pbC3bw5JGv_$EGYxn0A8^HPaoo*dzeS4jMG zH2c2!_pyrB1gZwMWa98Cw}lCd@pwL@JFCw6@NT6-TH8S4o}Nt4oPD37HIYt5^&w>y ziYtSJq?hlT8W7>$2US?lVk1n*8;A5PpFI6ZJ)ES&?*bqpX(TA^axSH7P$h3s(tGV< zqhvy8@*U~)Hc*A>;63_~SE!<=ki-TZ*EZzscPbO{ihP%JxU7(nG!o&QqYB@h7aJuL zxT6EoIv?^hH=Rq;s_4WzXV zR7sj_l#Y;fO0t2pwt*^1la105vO-HXkk&R(C26venUK~=DtU^LY)G1pYa2*N8VO3L zCs0N0PHdD+hz%sdtu~#Co+=j`B@_6zf)GUOd`PRMb4i-|bJ>$4{NA>xh)DOH+3;w9 zDoIm+C1(l~SkI!O5|wng29c0765;wtr@~SwnGhNYO6$@^6@GhH@=-D&G?fq1>208j zN;fkhJsGXNNt$SUZ${e?6%o=$rP7)}m88jroQcwziFDuK2@|NoZ^NNIZ9`fVJrOPA z66HhE;Ww&~kTepMPHzKMEDG^x;@&c{ntpLWkc+BJ-`B#z03 zr0IBOVrt!o)6$xdbCDk&rYJ z;e4c1QH+U=k_n-apmh3tpo;o)u~9N1HjoI92B?z#;r^c)*>@kfTBCE}jzCDeeE2dN zq*KvsGDKL6$Bzf*d=o^5^d(fHk`C7(5>h@$gzF=nib_;$luQVXM7TcEsi@qCJq!QoBh8z#q zhx|fBo0a^YMk=jsq*Ikl$ZUdCk|s~^EqrZ5R7A);A(hqysw7P|g?M4|^rQ5HaBy-djDD z);3Uu5svnRFuv`xqWESpr*l1AbHJ-qBK@e;E&alKnJ|I-nrItHNUf#Pnn0D*K}N!P zRa{ouE2OmzB&2*Y+VCmosFHS`k#Jr~50|P!T6=|rjBu&6CQyYnh;V}{cy|DMa{b}!O2`MQc2!>G@-%>r^H>Oc@m>e96a6 zpS|il>A8HgQX#EvAkpGBruW3hC|VP!Dz}<*zJK|+FcEk)^`6zvtHI;1kKMnAqhw3v zak1EOZ14ExV^iv!cc7sjCpWn-4yUiI|B*Y>;UjbNv{(Q6E89f|)!O&Bab!?^wBO6e zsiZR#5=#`XNNYk$@t1zp@}<^3u39x;%J9r;)pR8KNJwq=S*B@c!%xAvUk7ivQP1G_9l;Uz!Oxn&Gik4oc=`*bqrY}n z_B4SiKa0KUSG8ve#Ge0hj8d&hBvM&nZ>Mb_A(2l}g0v=3B@s@sTRK8o5ydXj+6JnA zJ;-^Ywh|(I>93AAGhKTwI50mZ>BC2s$9NC1T#t5Zay9~@_lu7^qGg|m8p-OG<>S@v zI+vr}V%)dm2stSlb-e_sc&{h0k(PM;Y$nJa(#|U({P+Li+)_PDtTBKYMIzmwtXm zmL5O+%|qCeIUlxB*9MDL@tM3PZBlaHr!toh%`BuhpwW4DJw6_u0f@g8iIOLZJ}JYX zMFpiBDa+>?bz!aiywf;+`np>AwnWYrF4lgVKcAW4HRN26W_>u*<2?`gxU%6R!K?LQS`(<^mD~S^FmF_T z+Ko7SPIx1acSB@iWSwW+@o#>8HP6}br9~le!^YW8b=u<36s-wV;n;`v9AW?C-Uo?J z9*?5OwfZd&X-%L?M$uDelqq4Xl`(bM&nGAq(#nR9MBA=BBIjLEQ_-40)pIkRaAkGt zghnM0i;jNQscH_tL|tvk{DERj*)T}VH!nE4<3Al0tqD}&HLlE2!`HQvkMmzVD_=aJ zRwQ`}TCFcNDD_dVW>Ynjkv5M*dRY)tsATetn(^UURYXVg`7tKs`iE$m!6?Wwar|HW3 z>nk};^B`^G<>bgos|GkatUmXVo|IcJ+ktEy{qnKPPdDXURF5;B`S>OD<6ul!`s;G+uH7VxTA6Eb@p z)1YcT+6#GQF&;mVklFG(IhuAh0s>XCqBCS*NrYTG)65I6KjaFTW@;)Q1_`+)r#T$b znn0CYP0)-iL`Xh-iFR78k?5lVs$ozFi1$7pc+J46R64?&h3sOqjZGKiYdmB zRyKTT+f)arLRt|93F#%M&XLvxs-*v*7|TrHHL}bZX&lTv>qBB~3!W#^D2lZ93RO5O z&P>P}GObf%|B=es}puN>7c1lmgAK zkXBw9R7pwGd@eH~^Br1mm-!B@M#+^vUGF*@zVszX$joW?9d#6~y+Revme8KIfrQNG z)_h-A&9yXvs!b2gbF;oa%j<^;i*cV=@mHQFkVk- zAhxD;39*YRY(<%)UFKADC4?$$E7~h0WOhbZUPx;KReWEbuOLfD$efX`Ad%KKP$lzE zx?;^t$b6TsUr~j$wtXzkdU-Q;zy4ORZDl`lYsk#3gStoxfhwnm|?i0lXG^`>>J-ncdOKrp&eI z%1dTs;Z;r~WKKo*QjykPp-N_CbVXMJkz5O%jC6=9{l+k0Qv@A5%?BGTFh zKTjQAF~^m3MfgbY^V?xs6R46}qvt&&AK_;|kl^QR*#^?ehCvlSbNT-fQd8gF_;enQ z&Qeb_wrd+m?0Iv&D_xppAgu{hjX0T~HK3VHX5#+gE8Tf%wuCCAoef{29f=mZUvxCh z$dJ}vp$hLugowZf5@)>roU=jmM5MJ>sKWayA;My=FY(0&ts6_8Xw@0prnVvHrBz^5 z;kvjZ0vkw(hqMBXv?fr69)<{C>O*R3lwEH}73N9XKtdvh?!+Rk2~OTX zkbcY0${$#T=RVV#WaU@i&Bw1EkaADhjL2qHkLFqVICC1+n2#?!H%VC6xCW8O#bneFkvwsYa@ShO?}l(tA>_m`nIO4^PG*e#4TSiy`)?kuL1&9 zKWt^9MyHoDd*#pB`mXB@C>o9)xy_|1t`?rl$0>TWS6iF0zkl7jTAde5!4baX9EnMF znf~lCO=}yd!tx2#hs8K{`R#%5n1N%7wt)mcvmK^2fhvCDI|JcM&Seb$q3%n0G8>@S zmGL}$m5RiUvv>yZ>gtyj?Ys(XpsLs0_goGBd1zIbuoy?8)bms0R_94Q=U%lsul^(N zIQok9ujFYPNJzx&oULg`1U9~^$evJ}z?`Fp+6EG64{2=!Rcrs{^?-`&OPh1dEz;Ts z_GH-aX6!``5^sFQZSaiybg!*#pbGnQw5JK|Epep?*G?SaOPwQu{UFlX2CDe23y${E z5!gPE);6RDsmGD}pbtIR3Aud0#(u;X%?Q5 zF!&4RDWg}4km#ee45XD;231&AnppdD^XT+tb>dmCyiz!4dked!+r%63SO3^iezT%R z%bIzIkMxhVP9CSUF~65>5xskJo%qVKnwUSkdC{86ExgI?Pgb-s-Z3qr=UHNbB~n#Y zdbCVKTyRp0XxVLb;`z&0<)SCIf50Aoc;7KM3arSJ0Fc9ZOk7w zAHytB=NKkLb(CpUbYt_T-jWArq!8_`jm4Juw2UTlYqTo5>4K)t2GYhnvb=fpgnw;W zJ@!hjl;V*ir{qg1JU#O4d@1$Qj;>)N@hEF!ytT2!<^u^Sg;bhL_k2sthn$m2a!xkT zo-r-0jhU7haP%vM;``Opj|m8uPL{&+t;<=jsH}!qqR}z06v}x?B_;ai9&1k#RjrLH zEb+0eb0jbyNZYqmsc(JDt!^ie*r6f|+d#0l;F59Ey z#;l+8d10*GZR@5VJ5&+PKjWFq_N5&ZZOjkXe_8m&4ei&}?lvTjs_*S{oo`07y}g4j zOCh>{(IEbLjX7(2U)e5R?b6moZ+Fb{z8P_0?A30qi#Feo<*nU!VXXRvZ105=FSK5D z*jq1t@VpIcpLyYu_+^7z7iG`N@-AL+ky0UTOqb(p$N##2TEXH~mnvexO|6T17iM|q zFKVY~V+I{}a(r{^GuIt;U8gvzsy<>p`6|ony7A%^;?ead#?9l)*1h=A74a=ATNm{# zlkI&_zr9i+ZA_&TD#VA~ar*i_J9;YO)g7&i{;8ks9h}xd(Z&=!P&I!2Su56VYT6}^ zDlBPTR^Pt2uW-Oq-?skl=mCnzw>5Z5!)&j|k`6JXjd}UEeT5%bqTj*(aa3UqYT}w_ zo5!iY?libXoUJ$UsHP}A=$qCq{oe$~^wd2$wg&Inei{+}{#P$d61f5KRNX9>##k^W zX~QqJ!33W-*Q4{2J)w=+u=s-b(^qs^H@aO`992K(Q!HiK_UNS$xBpx(e%|}nWS#%= zCGq(-`X=4q+IwoRL?7pg;%&>2)-K+Rd1+^Z_-||TTHn#Vog&Eh7B97Saf~Hm%)Oj* zbHL_2RV8JmiAvp1jMv`SIp_V_SH@lZoZ1?qkG1SbvDCzqp5eX4tz5riOoNm6QSW1}Z#5u9%-+??5gb=c8?(+vJ4MN6 z8}0OqsL&HlqW;U`@}hqwsO7YdjqLQZQ{`zZ$T<<2dik^n^)I%lxgHTn8*}`1w>ukax_rBVe__=%8`(z3_fJYsnDj)hM+DNwJUx99*)Xq6 z8_|}3VbxJ@vyE?hm;0ZHT#pE(ZTlX3v$JvNq9M8b3#*#!U>g@-adZk%$r6pu-LdN3 z%QVsTZz6KNSGw)ZL)w_HTK9A|{ym{$bn+ao=V=??$vZ2D(z)KI)4$H+w#8wB)dCi{FX)aKFRh@yM9WHj{mwin~$3$VT#fa-<;9P5l9znL_gNHudS~i`PpVNTA8BK@`L1s_pB+0iiYn>P!^8)D8^o`? z^rM`A*R_k%oU^T+GgRJGFJDH^UuM)x$w!YWb>f?6Jeo7$=MGVtSuV08au@Vk7#;zQS>q z`29ftD5|jjWxS$@31)pXvyAd6oa>G}EKB%)+MO$9ghmubpLVK4nwZtfpNQA)`LoK-!pPJKXHm+_mb$q*qM>uV}Ok z6EH(ogp7UUyNtC&8}rw3k@$)}Epp;pv!kdg9;vw$#GWzr|EU+>l~}*_+~+Te((LsP zd+pT2Mk1CQ#T8vGQB>Ob`qvHOH{UvE&CgxhDS~oKS7B6ENb8)Zs-!+N@lU~t@s2Mq zTUWH>3XVj3?L_g4Dw=Bzu~$pqzDjkz*NFw(kQAhx0=|;GfOi&S?AJUp$hvhWBw^9A8+oTxjy^YUaE(qIpeqXTCJOH zD@YsDYjOGb(A&>i|9geds!zdK~nGd!k%-+?YlOHy3_g{q*(K zE*ataDY)&^DFE0 z^1R*LaP1elGN&e$%$>|pWGRAr1L;MPHaLeXq`4Z++kSohgnXIl8UOfv znZwcXV#3Z7Lj=tkiBPmT#m@S&x8K=vu3drbu#{(ar?skOS5lk1nck5j=eV`k-xlY1 zv<_>`gycN&9b?xlQ&hBiE~~ZwKf!bpJ7Z-VLK{=X+PLc2x~n(Sx~Q|kDqLySE5Zjl zHIE<6sT*I>YIWh2qrOhi41iYqk2>e)gskbGaUCD0y937TF54nL(ys5GVpoKbIKlj# zkoyKm+u5rnXw|vCB~V4_;4T2zbL-UcO_tbd*W2snew>gsb|Gj@{}}U0LRRbTwSl#9 zza?I?YvHJ>I+%T@`v#g=XNiTDINRO@K!Vbe52TH`>*wb2k@k+sl+{d#3QIu~3wAe; z4_;m;zF}E$&S_;^RJ3|7G#$6=aMr7N)~g7V75yR}(%L)Hob!7v@s3?@N0sE3*2Oi^ z;FuQi6_)5{?*bqpB~3PvHscqc$b9Jsn1KqWdvLX+4KBUg;+R{ZrB7>qG zX^xU7tXJ-?OfnioMNuMYxjSG?jfoTDuQl4(;t`5=OGwKpYj)c>&UNi$!(-pLG__6p zETJW6jqL6+nn16RHl{5TMhIzZtm4+C3EMNot2ey%mHA1pguqfj+RjCjHip?NNGf+~ zgLDNcbwFvUL5gEzF08vRmsTbwwipn<`usN&G$W%mL`qZ6DSd%`a-FUqX`RuS>dn5) zz5Uj2vbPN$693u$LRXMeG&eHBf#8Pp(p+|rM7wybU! z@6z?11YJSWJ&$F(wkBkyS$kEjN}cG;XCBR&@pFgx-t4Ujx`L!T7^p(pnC(?hj>i7E zAm_`$ofI))!rKXxTu(;YnE3CNqL2LWK(;^N$~dat9s5>-t{~~oh9>sUC>MSG)LyMu zz1Azq6oIfE6qsTGyZy-^J@3J3zJ^4iU?V6)x_PQ zd@#Yj+iP5V{{v}b%IrHo`umrya(aK29Y@tGKT;|1{SQrSF!iJF3@ljN`&s=xvwVf1kVb0bBT|v_Q52TGbwNmZqvPIJh zE`IsaII1wWn&@iloZ_ldvd*QyLKR0M_g%(}UQ#}KN&Z>u+g0tQdbrgWznP#bNV+$H zv|X)TSUy^D=~?SfuhA=xD$K1W{%d^&2i3 z;rc5fsJD}Q!bsaTIQq-n4}WdH?ufm^iz@7$HBmmRrz@)scD44esvp?s<5k&2;~lO~ zq}5tJ-XytNTQb4xyGR=|z3B*NW9+!sa`_il-E$R>KD37XzYx6YjI=RZ$KLF0{5Luz zmw#c^?U#S*@0sIZs_UKdB&u0}n2LDZblZQVt^vf|iMv5%rU zm$qWeGp}(Ecm9Pf(h%G;AZ_npJ<-|a z9L&PqGhT4DwR7dSu08Tz-d=JpdTE)-xvA%s>p_`ovyBTg5HiOVuY|Vuwk^@;er zvH3t1dLlD&wo#XD_@nKdT4u#`T_dyQ@HI}dK73mrg;MTxtxqK?SM*X(yaoXE5hADt zX$=5r8ae2XpDMU}s^+_A1awmSTUC)r! zc5T0M>78#>cUO0GoYHI{9U-|*rL_%I_5X(7$60rOd1X%%(v#5|ne?2rmW5|hgfA-U z&qYP83+qM^1_`l8JvGvrKoz#G(h=BmBCTxr*!Q6dX+;<$uvbG`6R5(7DII~c0i?AJ zRAD4$CL|K+E-RL(9H-iJHvH5`Btl|0mDXO#c`06{L}{&8YL?2eU)w-JdLp`)hO{P7CA}KmE6hwt4bpuB%#+k$*QKpeyh1`^ zjP3{^t-V4OmQ`j#X7qHg2z|#qX&XqazBb`{xPO1BqG(N^3i~UxrwQ!OkqGte7UK~I z2_6S?-7~OAD;qwlB-*KW4iUbzkF$T_HGraz76v2EjAhTdl_~1mX=O^;Fi1T70`Hx0 z_{cUzJ0h@=PDP`d!d=d+B7pLS9gPQ(k7G!Wt$z zf3!IdX-!o6f>kp|ZOub_ndd%8%v;TLjl*v#TH8R?!l#+|>ZUg{6Ta9u=lYiU;#F?* z*79{l+xs!G^~J&xhz}p<$Y}M` z7Uc;>jJAP9|G7+m)a!LcYXVi+KBUgW*9OvZqBB~lSd#j%$%vygt-V5(ln=E*w3nHXsO+`3H?;_-v&dr%_Z9Mt&he&YMa*BJfH)p?d{L$deItotSE)_})K0qk+$aWG2K0 zU0EQl2~>$EG`lYyA$g+f1f-RXpmb?&i1wrm$wNg1rAvg=M=G64a9PpnkUU>RtIqNq z5IrfKndsPupSYlP4Wu=pp4m=5ap6{@-1FPKp6m!e8Hqj;Qfss>D$i>Wtq6lEDJzPr z5MeQ%w<967Mym!$I~xIkDycP!zKn#C@}Vm%DbeC5w)lB3WkVD2bPCd%kQ~yrtdv{v z6I=YeS7t&=q4@bLetOFhernG^_aHI1632WGlC5y*N?$^R^f)vZMOt~~qe`9^q`7ED z!klpfKR542mghN5quSq-I87swvSD5wlux^@z;uC>=r;uWo`DjNog702>Bk#u#3v?kK2 zIOkjnWG^!z_UQUkY!Iypt>QYMYo`$5OI+1SmQTyJhg5Eb2z!OZyl2_>ZBHKU-Z-U^ zC|p*k!agx`=_1jv0^7JEQc3lwI_Id8c%|MM?PVrjzMpIG-r2QOKkta3tWYIwh1Px0 zp0Z39&=Z0DRGH~5B95|R(<8IX21e2FW3 z8W;Ou8KY<=OnK!afzJygtq7x49PKn0%}Dr2yUTUwJr z71G)U5)%3JRvXfe2yAFo@ys$r_~I23(t_!^3~7TjFSVz)av@M9y#dX4Lj*zY9y+!= ztmjZ03~V6r(^QTax~@gqo*ukHm72X|j6_k9`u ziQ`mS6R47wnvrl`At5c82&4lWjzAUGvnHDT)2pDik2D_`yseQQURD5>OGa7rI@E4?khEx9Tb7jry_04G;he-zV`i$sdnF` zRF#y1CZgMhxA`+sKVHjRq6oT|CePUtA++69rP6&lWhO=9Sp%}8sKQ#)1eMk7$x{mV zwwvI}N}g86XOf91e%5(t^Y3#OoI0Se)0;O(@#$z(Ax#$SJ5m?TF1)bT4T`|0ijiib z=D<%1pE-J1G*u6@CHVda zdO~S=vx9BiJ7sfjzriCEK`|!2Bh5tLQL}U3sd|HpD^aDEf*d#IgoW*L7JpPFy2nUtsT)W%l2^5`)m)Fs*>Dlf^zcI`tza< zk7=U_d~b#bp*iO*bLvEkwswf3Dz&7Gi8k-`ZQJytp3$iTdHj$Z(wH&Aj)OEt(O5Dk zxqp!{?_b-XV9MmK(G@SA@YMBACFj0H!r06|+8!FZu3Vda)Ws8`Z`?VhFw%WfVsf`u-rVWK+$>CJvUiNF|Cuv}+Zox%&6XFeeDLPz zx{C)ZV#t%55?|Q**!Ia_McejaiLsB|99?wE;6hZPSC}VbUW`p{QFi9wXq#JqC_Ltu zMB>OTt-OnmjEr5~Xj7uaHLbj(&%MsspmuZE9=CfZoVGXnDce4JU-e00NR{;6}@K1Bb`NFn`AU((aw?3++fyxTA_9h^Bt!_9J6sNExLN8#_Za5ID41v zrR_gugS?`i^YHaI#*j9qsOfJ77d2=Yy|ZpRM~Lc&Ziz(MuUmO5`lk}FTjD^ShS72j zH1SxIL}FH%*4~+?Oo$1N`RKbh z_Hu-%cGpNG>RV!Zn{>oAmS`|u6R%fGBXqD%gGMW2)NX6T=6vkM zY(r@K#=0dg8v9D_I|E0@QH43jayuPtw`@$5wdu)!r6V3I zdaljj6ym$rHzq!*lI1lp8H0Hpl zJ6o^VII(bT^P3cL$l924d6rlC5sopTjrpM2kTvC>-?gFaq}$`DLa#7S#;kd5XZA7n zTJ3?OhsE1eOeFqz%lf|eCKr9;iL0BhvRn(cyPlpqv0(kC&4ojHj8MdS8&^Ng%<^vY zI8QuygZ9?8%4E*mvY(RRnIHxFiiVf%IZm#UK7QqIMmwejU|1*@+=Gd}mVJVorV zefuBvvc2;L+?Y~ULoIP=+?nw^H|NDsm0Hqb&zKn(9o44Mjxq6^X-f;qI;{xNNKfPL z4R*!remgohICoRxt~uG>l-I7cIj{JA(}D}i42!oI_K6~hrZqB}y&!G(Nqw$a!9)AU z#83TTi6cbyR=-V&q9xhh?{$Zz5N|#DK=z*IL*v`G?JV4XFp(&ln(dw1cBIR#c&NSl zuxo{a?-%!p-+A-VaU>eqSzJjcg#Zy&M2UsG;yn51>oHOp}6TfZw z(Tb?MEs;3=M!O%x?W0rbyyEbB*>~K1dHmUnPKl!mV@cQf+7C`I7-9RWn4OEJt|vBG zo9$+qM9A8r-EDgI!koNsC&lln{oDGwZ*EGAD9rXA=sD1NA_ShvnAhSTt&Kf#TfE8{ z#}^{e-Oem`t;zQO*~v3Yp^d3l|HHLk+1_pCty2n9RZ^SeRWT9$HM`9d_udx&w95&K zICF-by}oMq$mn#9^H6AG?!UQK&dOVFihq+kz7SOyC1j(RXfv-@!8YqvjoYS#R%^)< zy2cTLR&MQ{fGy|e)UPxyUVGiV+`c1=64h5`dn-Qb8I%Q9x{FJ_z zDq^a=Dw=M~s>A7QL+sf-mlt*}xX#w#c6*JJs*+lhvLbtSFN>!dx0&?U#P~TiJLDo! zu~kvxp>^5bxhM5?9tv%*wntCP&aF8qKJTR$+oB3rn#o2nu{Y<`f+pN*b8%G`%ZJj% zE5cs=c5Prq6$~cHPOCG@9YD1 zz5Tuh^9#p3kX1zM?bQd{XC3VxQdG}B*fc%cLhJ4H%#591)o+~rk6mwn_KhFfJU>6H zh}PRHnHr9u+|s@{2j*rK(R%yJ3+!?C*NxZP<8)q{x6{6Jl&0$%Ogb53+Pn0!W7-p-Ar?0s+B75vBJM z6cG@Rn(QX~Se9O-igb`By{I%1`0jnPH@UOx_kHKjIh-?RbANlM?UXxr?qmad`_8QG zO&$l3ODVKi{be89PO!Iso}IUR~H+h5Ihbfr!7DX_O0RkrKmMkqC}_T zuH$0A`|AP&(q0n4{PMVyNTku0lH7kkaO;obtk~)l!%}Hyg;;yCkE`;8tx+}@<x zEygEG!Mgq3JK3*r&wzC(%h9f3)~I@yR6>a&$7u^0F=1=!cc8;xirU612k8?pQj4TC zJD4qX$vKt49HJ%Nidzag(r8P^+3U|zpH`S?m4l>|R#S-BJp)~M&y)oncoC)j0ci+@ei=WsHb(k1oInGQzj9&-Mm(&C(f_I8}3a4tc6JNk|a z@nUTm?G)JC>um_OW*j0gCp2?%8uqpO%4o#~cQ6_yWwS<6l3F~?=0$sZj&8-HRiabm zNT(Ojaf(8#Z0*`ewMX z>-7?a7!E5Aw71{xAy*kh3(+2kmSAu1Q+=sIB+a#X(cb=MWzlF(3$eV0a6JNh`+2Yf z@VsLh?Yq^&i$-%=i0I00?Q5{NUtC_^B1kHHq0Ni-_Q7@i2?r2cz~1gYq7ue3n-}fv z->fJS&1tX{waeu~d%NrFt*JaGm_|!Fu9i3rqxaKKY_q`LUj5f{7C}-!z*-CK?XLoe z4}mBT_V$FkWfh`YqRor;_8*=Uj^;GPL%w<}8TL5F%h_9_cupvXrwnW{(auzAtm-r*v|#qhNU(wIgY za*?GNFJt-#o3-!2-oC0yPlcGj(dI>a`;kMEAl(qB2#7?mw>J#wsdFiwD@C8!vTAeP zU+48Su6%i0@43h3%>uu>j0qvpBV9Hx+S}jOkvWvVn-Iv=%~H>uJ>d7zJocO(AVqn{ za#$-_Bx={MsAc|gu+eYhc7<5J%jQLU`&lflQu6vhd=B>ZzUQ~=T*|-R((5X+(Wbf` z!QNi|-`s}vT|Vvi4%xhDZ?C_*Kr}C(5KS8$b2_BGT_KRhaiw%ZfoM((@v~=*W&`Va zr7Ry<1W9#2YV)GK{oxdUVk;1rffy2`5_eA8yl8Kq^eTTer(r+1|E;qToQ#fy(VFK3 z(>QV(Yw|~P8f*8lwgBwy^-46d2$E{}tIdn{_5$nti7+6}mnds|R9Yo|IdAi#y}gc> zKbq4*^xQ36%VFkx2ld5sf@z$|3O)&r=Cly)o=&$t%AeK9Il7}okkrjfHZR)SF9r}@ zfUuR!YGfIr5`8b*yl8J9c{4bg(?XOOozHm}RvD$CH}afd8fX3d1A?PD4Q<}HrfW*Y zoBHT#y)1&Hwq3J%(cWHYp+Dh_D69Q&GN0aTV7#&Rmd%Uyc2Pdq>aV!ou@w)FegdDP zy}fe@_*~c<40YD}YO;QQ!)S$=c*EvJd;5*HDlNp$T3ei_VGWl8qqV;jN!{;MqCFSQ1Y^aq>eON)B&RDkRAG)xWNXO;w9(x1~vdFdD9*F^cI8S zt-2!Zf8K_=0(*P8EdC{*fBBvB+LWzP!(b#;@{7I1S{3Ju=Clx_F89+GpI#f;<4;MD zRDnOB?*dUWQ}BNfh5lI^*~O2j00i3G=Vu6x<}{qwZgV;BPT86|*_SKQfjPvLH?|X+S~gD5DgRNIYVKu_7Yk!2HF|z?Ug&pHXt4NO}JOX zUI{k+bCZ*PagTGKt20I+GJ+1Yx4S?G*A2_7Zl6Zvk@j|jOYvN(#M`$QotHU_+2 zE?j{*9PI6V_sH)}%L%s4HQ0;5?-4vXejTetfW1AT{Q!mN2mK1|?WG3$(c;yavD(88 zd)?)_3^2Hqe=Vfx6P-ssbFKm#Kt}Mn8*|R)MSFXrPWi3UrsV{3g*E^j?O@zZ*{4k{ zn8lo3pp!zFFqWXbeahc5S823x0r4<6i@C30Cxc7**FriGJbRDrV%~b@yZV)lp)j7K zz5N-?09d2Ai^tiZ{SliN?d=_x!RI0`5IGCfGvjoX_~3-ii}v>ZqOMjx{wpmUs>{D~gFBkPGyFm)nfcP*R_;ZU~k{qF}Ff2{|Q#FU~ez5QLbLo zXwhI~G1o4zw@=ka>0FBU64a4Stk}^}y8yX51g8N0)>_O7?s15~eH%o_ud~`!8SL#> zoU7dJ=GeSwZ=Z8mN)e%aleqn=m9`k{?fbekSBOy96`{R-BkYQ(-rQt<`*WC5Z~FDyDP?d;6^7&D@+Qz1ZeOd;9j+sy!KI&cQRC2H4yCZrzZ|r4&mu z=t$EiX7?$rH2{12AD@D^te+JaYt*VAAkrqp(i00rdOw}4IgYr| zle|Hd{r0_QHS@~5>Lz~I`TCmmU9V&9-s6VmNL(uQm2IwB`ryS|Ex}&rE6tqQriNLs zuiZOa*Bq}lt5TeXRd}`q+V6kZO#Piod@o-*{Z(XTeOMhIFL`3%2&hgJrSchdX5?fC2u_bzIL#f z-E=2aSBR@n)9V_*Tc*C6PA~bOXLIcL_G#w#@YW%h;`N4YlTH*_c*5EJd4&1k-&Ra}B=W_(2BvFt zIg?BA(yF<7(0P-F??K>y>=`&B*?*&!yg$ZlUok`> zc)f8NRx-_NX>>;4^tt982J`uxMgx`F#T?>DB)ttU9y*>hs&=e-$MM$9iP^6-??uSr z<+mygwk05b3Xe5wguQihDc)+l7ObHpVK9u;4mjJs|5&qTFZ7y3DVz-`jiac1{~VZv z8!+Q+g&Btvv;Nf5^3G|gg9v{qDs3QfE_8tTVAMW0C;s?L^PZfiIflLMZ{?6^A^JAV zX>UBXry2X~wwp`wdP5!QM7_yj+CV5do(Vs@r+K@-+1-(-s*sqtZU@4#i6V@JNWe#E1B;mJ{-^fP<>bxf~U&hDKA zQoRbatLc@xmM>=Jnvke5aIc=L`KB*GlyP1ruTrE>oOk?5_s)GaGI=rVy*U*}c2xXpWUBYQ4cLW6NgQi=XIgt{;Cw=Tf{z zxjrEt73gB0tyc$+ExUo*aju;tKC0iWa+I};$2UzDJ&*KGg;h-lc!${<83f&M;{>L0 zMn;0ulE~VEtW%bj2YY1kNBu%^}65IjxvLXS2gaKk>0Jaqd)rM zL#sw9hk?23eJIK-@k=4XO&23YO`k<)582KdohLB z(m&FhI0V|fP>hvBqQN76L}cBz9XgmXm$DgLim!1|M>>J|!ds0Qz{2u)P?TlgX}!C# z^}SSYNTBrtKZjGYLtgv5mqBKp@|_f7R<|f`r>8bY(Y{R-8oY5^<**kV6>Roh*V^Dx zygg6{>63M}7;I$Ez($6DLA%)X0S)Ru+8&jb#?R4G)Obrn$km&6^X(g^c60xGYOE2v zKFa$gysqMc*HyR_r=^a=O_sRbMMo&a&ZSXl-^*!96agFAYOs;{OHuu(#HDr9?OPV^ zb9eb*fI`H45#=2WZ>5}qcZHB3TI%SK^`X1=y*PtQ`L|6vQE*WS`&PI=I0kH%*+>ftBcE$OZ%n6(t$QvtV5}z@GrHaPVZKU!l}^ymhDv%l$HeEAN&z?_)AgSSmp51 zLNvLu%>K)v+Np&=2Pg7C4hy_*bF}p3kZ7qR_vRpXspIhmm*TC4I?{>JIg8oL!~MZ; zpqKQ6HeU>HJAL45b1E$oXxWy%1hw=mAFH?iW2{1;4o*;7=4$a@LHebm@dlUjujzDR zz{&jfVQ|ur4^A3dLOaif_oJ@(+L>}<)fJp<$X^s{Svh;Jo;PlQLSP@`1f^xJ%0w>F z&Eg}heno%ruLb&Ch=q3y?IfJayoFPlPvMtp&llmC(M$eP@w|n8^LQeJBdXLfRL^Cc z{h*yfSUr&uL`z~^j)!{pyK!=4@JadCf=YB6UCqeeFw(#=oU~*8Q2Ga)4LsqF-#((* zATq9`F}GAxg%}EB`}JpVUJGM8r-cZ+r`bdI<}$XPYHM&Q|5_k@LKM1nMyn6?lnS>- z5@D?EG&|h!mv5}ab3B}{PzRn`%Go(2GB_#!=;lV{uEiB%3Csq+0ddSn5Djly6wRB| z8P4wT-nPFK#F>epo-F z;QV8HW>_J;>~o6dsttoI&#dPp?&r2Q=|2Yb2^u@dIp?S4 zMpyH7Cs&#j^mxZimMH13KxowipqXs_0)b$HtD zj`XQIeEUIz_Jc&=PU!s(a2gJKK&&gG;T6}*uWSOmEW+XblD`ys3t$VXMAZWWlNQYz zVtkx&vqIqhqX-bV^HSR*$TKjh=VybA&99SnF2#F>O5B1y&WXaqj480k;RNn?vc-bu zh;LU!{TR-?D!z?KYBSKt2Ky*3#eb<>pAf!1r-6G;UP9b+t_F`3+}-oG5yEE!FiwLF zfD@ReTdkb7W`hK<0T`3O2Ee7P-932Lpp7Je5MTqaZnAQM^r3}?({jcEn~Z@r87_rZ z18nF2CW4{OPk^TrCooMnGC3`EaDt@J+CpiS=n@vHZG&I!Q1A*vtIF(=;c50OA}oFI z3r5?S5cjL*vUeKN)7Vtx4~0PcOm!F&$%;d?%vG(r1B^0p`z$LCN%36qG6^y3@td~P@;|cACmtiJDdn?a7rg4r! zdnv@@II!Fv-?M?yGpxKqpbc@|cj1-=lG8%`c(k59N9|_DXJAj{QkF%~mlKuv<)?AB z-t*cUW%K1Q(OP#eA>6XDaw)VeQu)AUdE!jc58<&!J+Sq00_}bkpyXs7q*@T-84wXt*t#y4{}Zq-HeCQp4m@{3J%r z753ilu(nzWzO~qDxE{1_;T{DWvM-IF<4Q)_+mDnEvv1y)-Pq}EZ^pUp-W>139UC5x zvU(y(&1bayeVjjA+;~*9xk5DC1f!_$dsQ9Ckl(An6!mbG_+&sq`{&)O8*lpCO-`VF zzo-d*!M<|?qJ?<>NlenMn!52>XKB+XDc*vpBc0fEv!82r?nvXxR(Wnfgb8OM9iTlv zfYTFBL(SeT8}(#Rj4`H3h{>gR8>mF#6_=b%{)#ZliBN^WlbG?)Gw5_Fz0Ln9veb#SJUKDyf1NmvORXdJo^{;o?{7dzl66}=RdKhrSWszvFx;Nnf~4-%APY%tls#} zSo6|7yEpgD2#1+-yw&C;#c8SI*0aU>uN6lq#NF%mwC`1QATuBKYT+MG&@1loOMFF`HimUVSsek6Md5vYR`l(uq}5cxxpyF28HOZnGy zI&o@}OUn*+pE+hE+L>}<)zvk+i;P;FPrdHbQwAsm_AyRSTITA;v&HT+ z(092M_IxT+K*5QJeuFpM`uy~>J;w>n=#{mGK{FYC7oOzfJXolx)Q4jt>Vvh< zteN%;Yc=Cc?HUI90pMIKLR2YEgUu(8N4uU;GuB;K2|VG)8M%Ibm4-Kq8_jiIs9`hC z?XGEXDH?-+E8tHwX!63D0;`PJLRAg)1He_rF}o^7Yl+@*SdR6cH`>hdZU8|X~Ib#WnkiVjkXj->tI05y> z^g%qp=Nq*HyJL*x>LCij>y6WJZ=zN->;4Dr`_Ru0rEt$lX}WuY z@o${~H#uq2;@4IqE$T!o-rJl^0zf@oQC zjAr!;JQ}$auQ!!AS1Z&$KIaId^XesT^aDV<&-<@suCP5YCuH3j)ByeZ{_VO*+g)X} zvGv1g3PJXy#v4=`>Z(OU+XS$9{Swl}O?Ik6?NupGL!60kwkNFsi`R*7swf0mRSH9{ z)Vj(AL>3@^UQxx(rTlA}$|OWoy9M@H_l6kz%l?#R%fQl-)#wm-F{&l+^Wngx+|U#6 zG3y5sm=o+7=x4`i@Ozy#C}|zouiE~TZ0R5=vL~H#`4g|RH%~4CHsqzpkGaVLRRN?p zK^EcgTi71&?K>4wr}aQ%;=iUskS#0cG?j*Z)VHq49z};4&oiubb19y8u1|=}S29O- z?AFh4J~-wkOLOjw#g$y)sr4MNC)du2D}c$vibP&d=x4;ms05zyzXmIJw`cyjT2LrQ zlGM9&&S!%M8p|I*F9DUvOq7e z`&KnRS_o#Rc5^A76W;zp)QNdv4+dL!=`+U^0#EqSF8*6Swcg-#DS4@Vz_q@{(a;la zF2!q<>w`I}W*2*SRCQy_EW3%?ajwNE1#}98cWP(A$A?P3~tsqz-~-=^1I{8f;V zQm&Ii;0gcQJQ0qhTO|}4E~RwLVgF=guyK1`Ym-ay_Tc(tt}eiBr^C!@fOqogBo@<1 z;Qn0RSbs2MzWwItZu+*NQ=WZ!9`OA?WlKzgN|P%mc6* zlmn}QzZBJvO7y!v-F|A;KD~d{0SeI;&W9Jl`EZeTQU}p8S3d_m)D!Q;nOw@hZPJO{ zt4i2gLCk^Su%pijr|gknH7N1Q_r0)-$G8TVE8N$n$2Dj$x^`+X?C3d>eqOKAGFQVP zb^^vV@R!0}Jhg}P9KhHK@BhBce)>@DDDVSN2t46`2v&nCz8n%Qb^N#`NDqenIhW$C zhUG{nt~@JhF9qHrXQ7w$hBhAxz8`&kZBC^{0(aZ#aSeKf#<~~Z9;*O4<&7hsfgTKdLZDoy8PLRNTZF*dTyUX{w3wIl! z5aeq@J&|actAxlU?k&YfSpACr;$I8&Ih@zp3~dwm`xJuTIi7&;eQa|qyDfjIloQMq z+5pny8Wd=d%dGf*JB1*R6dEOnmbto^>!Ew^oj5r%_)6$s3o0>hcs290CXpuja-nvf zlO&uCz$>gj%?1gDdXzM8mu#vK17U103qD?7!Pw4eA%_31*%$4}W$r%R*5p$DwUA!& z$`{UP$Dp33gLm}zFxGw#K35HWV=a1x;e3TU(3?ue#aaJ4bJD@_&CPf1iYo-3@P7cr zQ6E9H5JzWaPWl`C&N148zZB&Jb)*x)17jlVRBvgnZdXVl@PvO4_^mydEOSM)5S#QF z_6pT>^KfhxlS}a$RqN_j>_^GFyY(}dKRf2e)eHJ;;#v*oaP0hih9Qtyi6rSXx|E31(Hl9Oh^QKGeJ+JpQ-&B(867*uE)eC(ur@=3y*gy97zz4F? z=3~}MhKM-u1BeAb%dcU5rRrE@%+Llu`_$aO;+&gHVU40UCa$SfqTQpx_QgB8o0sN2 zRR}!c{{#Bc=}B@vCmJF;Y+jbs2>eCwzGhn-Y*pbPxzm} zZ5Q#i)Il`Fnrv9amg`V^^Kfc*lS}#c{B+`Kg{HO);2nLheiv(RKzE{WhqP;#=D-~i z?uyX28uwIiRy2Ei(kbwcE?20ELg0P}y`yng#ObuXnn`;#^zx?N9qChb`1XS)?FWg# zoe=th;~o&}ifAEPjeBXk1QzEb;HU2|MQxxGXJ(B}3Y|a1%>HhZLg4-bJ+N`-rM5@H z__0Ydz@PdK?4!68?-?pl0rogOiw-mYhCL1^aKD4z(X=a~ek??rRBIn)PJ(?Dm*T%v zt`DNh%RQ&L4fdS8gt+HKFMr(K^R|K8iCBd zB!$)%N~?s~sFwBu?!H!pyRT?f!Fw!Zzaj$l$zK#&2UkX=-OW%4x~D-_9HM2eCd2)Y zS!4EDRvf(Zfl@qIyiDN#ICY~o0q)~$su*I~Eb;CV*(@n1bRP$;c;I!vykio2F2gM$ z%aV%suF&4f^NwkpqtIRo@!NN-uy<(L!2I!}@(O_#LA;5CHbhPfQ8Qb8duXj@=3=lX zaw(n@mH6adylvDs?ad~Iau{f>!@E{!W93qG#|X;@afFv1PjbMWpXFfd;{@IRA?qO3 z0{GAau?OxIU5=L4LA*<{}j_mDpHo?yAR%@aXc*1|efZvDj{DWvAYK_=!2ggbCWri9C zm*OWeYOb*N`Xc;U7GYcuVr&6A1;RA8Caz?pz5V^lVfHWgW;ciLZEw(dR7ivTiWH~i z?_&X+d6h2KTp{TE3%^&@fed(NS}*GOOHmJ3iDIsT_CB%I%^QR41}EtBjm`~-27jNJ zPD#l&-Q3wq+Vt_3AxiNUL>=kGp3d>EllSaqr*rb$fQbEYdV;qo@$`h#u)g}BLezVk zW6Z_(3m9CAw}DDTXFu*d2e&f^|65Zb@FWIrnbPS}dYk_^wwJR&1Dm;FLrsHA@xH|M z$@Tz$J9j3qLShMVhlNo!=p+`?_&M%aWb}*I?W63jJh5*5&RBy^L-R$cQk<4LD#BUn zUlm6v1f8qm_o_OO@kJ^${H3T@s>J!jHv6uod)>{33{VIF%)Iqe&)$6_w-1Y)J z3@*j{E9yum7QHsLI}jsf64=A(l>H<`Qn9409eqA4jXPniH>o4v&$XhKdQ^hW>)*YT zgxsI!^AXP=;>ow5!(WQphU*ie^nAmflGm~tCszkhry-%YdW1seLdTS zegNAF)G#yrxWj{f02mJ-dH4Tx{?wed(s1S_;{oJ9c_w0y&wrN_^J*t~D)>BpIW5Gi6K5jU`Fw=A6mK<^ zz|jPK&+*2(Ga<=(mkRyOQHp%eF-_j_a)cvKa!xGkpOp4;5~o$dUkXoRv9y6isLwB) z6Tf_t_W$}SJx1rcIh zpGD5a;0JIL;sJ2tn{i1Vy1T+@uyWRKn7jb|0RDoTFBexPdFZwam*TW_^Cbdrz6^$& zFAA|H$wN0^IBng{h=6zi*4>P(Op4c=O7!Z!z?BvJ0Jc>4N#}ow{eG8+Zl$OtpY9qE z0kOgj8+hb$0@K(t@a7ArVf66~jKF&=o8TS`mkRrMr-yE$sKmh*b!>Q-tS8(h%W`|C zhwhAVVoJ-M9=c-&I~MJ265eA8f_p5S=rUlJhi<-b8Z2I#D`gJcmH9i@TAfSroT$Wv zYFSc7!(Fl#SB~j-H}3GzT{13}tK$w2`T@vz08Q!_PD!5B&$!c8C0f4Q;XywDj0eDJ z*xmKckrD}a;@og2j!W^+MyDnC9} zi0^tr98uqWHQr7TgKqu|=XAKQ)&}mYaVee?mDmyg!ZjEC01llzrVwv3?(oq4I8F<3 z*gdUFpV=Z-d^Rj980o)QquUSOjAn-Ni{t4y$AgO+QOYtmDr^h3k!~lG7|e#HFkqX zB>DkhJOHjQFjudNM;VW1szh@3^=W0|w3Vy0mz4db@LV3-StZJrw7Ir}A3$u5Vg@I+ zCvNnhA3!SHQAL7im^rW1taBXv0KUGM&EQgejjIya6HmiRAL9Wm{qnoCS58ri>J8Jl z3YWK+TORhhX1xqD3P3ynPW+JRdk^{nU_1a$3lY>khpP|x0bGT609=Z5`s#Go5%2>TSapCx^xL<_gMI)@;hs1W zM9W-d13!S{5D$P$@tRhN72lR{K|Fv|j0cePexe8c0KS6T_Lh`oHE>vI+-;}F186+8 zc4}6z8gQaZ;Y5$L6i9;7vgD^B<^aAY>@P)a!}URg*elCiC8ZyLLM(PrsYIK%MO~A@wsa7B$=QvG9`plf>uYl=EfQ#3N{BG)9tYe zfjT%rX_>2MmxA2Oj>Q{Xiq{+JNGI}a%J2HS`#JXnh#GMa+8O--s;-mmOgTXU?LO)8 z0DfP(*Zoi+ z*sC+nU*P;>2AqG~fUy?+0B-umTC~vOe1$sj6hO|-cQC<=Z6*V`9Yh?+Uqd(aO6 z;{hN+v=C!*Ws0CEH~vzT6P4)FCnjZIwU(ydzL3F*)i7V79{|P!P)j~8dWP#8@B{cb zwu-@}c#W#Wcgw?Vkr30VJH&Lt)eFUL!Z{qz9We?NuGA>j6GU$f%9Jt%`~Xti$MpNK zLP9?Pj0eC8{!K!ZTw5^ZAMgW6g?Ip*z||Q=YvMGtN6ojc=I#2KrwjdJt>H+@4fYxI z1HgCyD)BVKQrDInea({Pggq{&B4aKY$Axk69}jA~N>c>Ont%eGm_T z)9^a5F~d0!`~VKX`ie_ojpBJ7uBla`<@Ld?d^@|FWgs2^Cu;t&*@J!n7!QEc5DCG( zGy>yB*&uF|zZCU8mH4y8vWV^HyO}lmzElWz+-48@0bo1;B#4I7rR_zMr-2_p?$qoC zm-6rV=|q;|O_Pg(A3!ifNyG2L6Ia~#;eKb=E*UWmcSRIq4PtT(-5#+6`~ch#C5;of z-=QdJoKD-TnY349afA+w8?NOv>ITq{BPnqv^mCTTH2$JwJb={=bGjNrjK-c2qmdJ6pP{IZoR+nF z9{d3ALmWsh#dD<+TK|nsC-?ziTu!vTQ4CX_6Uz?gi|PpxVrzDc@I^4QEU6TKl@pl8 zSxv?R_JIh`nf`Cj#x%6s4EbFxS=(Ny#7@nwucf zEtf)@F13wHbkDKCc^x7TM?vIaJZYd<#a!w*oH|exV(`oO^GnzIMVk3GS|vV&^AGd` zz<2TefaLaa^k?Ot!dxOX-S}0CjR%Aq8_diGkz@S z@_-+}H-qd7f!2D8Ba8&m5V7}U#|Vn?%cXb=s>E>bSo^OKNB9uL5$446)!RH2O_|eR z7cEjDb>hYt^OMH~OfJRSKqcZgpU|3vA3(-8H5CF+Vkp`)ry*k2{UKT@h);bS;!|@e z-j`GY+dLR#iHa^G!xOG?Pw{g}qRb9y|0VCe^-5cAq? zv3B$rL4eaTS8XBYzyi?WFGX#m61%=NTwB2pAV1t5-~{H7A{HP)wA2v=H}5|I&weh& zTTLb6M!TIG!AAW%c=lrpQVa-`qS9g-?LM-Xpq9*uUG=Xa9snm$2PY^kbG6zRrGQKM z*K|5@ZlBBf1^5BH5BEQ?1u51oT}imIasM zWeOzf*QjnhT_Q&xI-Nu*O7n9=sRLuAJcf7xIKq(>j*k>!h0_q#@zY(-c5p}d8yKnm zrKq$jfm$FQfDr@n061awc3=GQqc^TfOo`i{jIZ6G z$1ne0UJg#f8`9b8yQ+cz?h5eV|X{U(( z<|swJ=a?q%csat6?>Q%EuZDT&v`Y9(QE3AS@(bq#?G4dK90{V~ZSp9&=j`?Dw$7z^ zy{SaQsg@srbr*nk?s#JWrKq%&D*h-Y-h8PDH(wOOXYscxQ|gWD%C}07f4_l~lL&KojEuaDr@Ec=LtRu#ft}l~NJz%6yt>t(!~n zoTx;uSD8~5Lar9wKjtP&Gu|cRQg~{O_GB3kpp8)`8J%2t47Z`*EBWBIDgzuD0+l zz>0Av++2#+s7kbZ*4Y(eR5#r->?Uf*xfbtN(kT$$28{tf0DKpq65Rk5cyki}a{|*i zBO}3SYb;54-mRqB1>ym4skU%dgzo~Zf;*!s(c@UIoz7ZO=G);_P4ol6cL6XS0M{3o zt6LkQ%%2}sQ3yP*r!sL`j&NjE^OvG_R*ARuY_3M|F2IWH#Y|4jgR?1o7oaWNQAL7i zc**R7zB4Dh3$PF30dOh4##IT-*UxZ1SPWJHbi#)>eNl>P7t^?}mA99h?Do0}yb3aR zLp%UZ;0Zsz3xM$eI4#7s=p3%NQNd;y!~@_`yggI`GL_)FJz%vU?k(}oIi18}8VR%- z$eZ5TJI#0H{j8fi1mXb{1U~?L7a#`ihI1)S%l0?|?*f<*4}cSNu8QBwX-W8Q519T^ zR6i=QF?qTxY5qRBV$|9auGVl@ ze*~;e4#Furz6($oZrfW@U^T#a0GP&oZF)R_VxHPjm*B2GC(=*&Ra)k11jHP`cmV!V z)HYln+;IDSnX8<97eFEKgdg7pz<2;i5G{2;JODSw1K?7;)l_0ywqh^5@cz)Lbup0ae z@c^&|@m+wdzILXZAc6bZ^mqU*zS*na?>;~wu#a(q(lS@w?Mw8_5D$P$`PV`^@#Qna z3Go07j0bQ6`~dJ>0E`E~bAoBK4W!2dxDb`guvKZN5LQq0<(<!dQ#%0z~`9T8j08I?|)6OrDlMq7A$YaJoxzg~0QAd=~)Y z0U$xN5HFVGi=Zes{!)|^m1wr7eaaYk7vS3}1x-%i2|vCIfbjs-k}vykhN~F73y{*a zipiyTjjF_|0?lnj!IyIx#B{>d3;Jy0S`FuL^!~(EAFkBU$5X}wc)2uZ%5M-0sV&4p z!c%>G7Xae{aDso65R0!AOqn&IpYa{U1KXt^$-XhvL$(?TRpf8iPkK9HkM9kW(4M34vNd{|#` z8uo%qXE^QPXPLP2oSREwjZ*Y1mG~(C5Z60+7a(@-Q-vr4egOC`0LBC0G@SfYSQ9~U zqXMLWAX^sc6QbyfH4!y0bTfv3`qIq_JmJT80WcnbrNc)H(K>g*QKT~5@1UnN?vQX-guc}>9sop1i@+#pXCO)%C&=#^_dA@1 zyE1aGX3$=ZqP=li)#2L@8nhoI0(U~_3yyn0PQwb^^(r|Bct_uX^9g?`s!^3V{>7jO zef|(*@7qlZf%^~iz{Z^y5=4WS#jHUQ6jzN)@t&a)-^x9X(FgW8oWT7KdPmc)DE;@b z;lQaRimS$@_%D^~v*H2Zp3}g10K9~_=R_}mYj^MSNyoMk!Xa${R!l%nV49-(aazs> z6cdn3S-bms==WOK+T)TwNl;8cPLMvdws2Y!7^4wwGF%F+2G}eAo1hqtoWL};8rozy zEp>2$q|n+zX_XjRGt@Z_yu75#mfY5%Rb-e#JHSE5SJ5eZ+Lf!Y?ku39TIKX;ovrp zj0bS~bjygg;5P{G0$7$*ymy86R-SiEY+u&V*VcVqjoZ|1IrJ2qq_?d+ehxHfQ z0l2Bx3L^H>O+71ufbVu5TID$nFFX7gl2QvI-HwMyw`k4AJA5dGHeG5Pl^7W8ao&K) z!)qb(Fx@z$vkA%-p50OuVj->^`rP&7GR@els|23#<2^`>2cYVBx^|~)2fPdLMNkcc zOYxH!mB8K$drkxPoCek+t_SgEDV+jg8b8N%khHfysubp$wKuyl7~%oY=@Q;DN<2N`G`zc%xm@a;VKIj8 z2r;-6Zv&Mmn(3l;7~Ta~@vf#q;7JVLGNscc>M?LW=$NZveCo3hpPEbYzQpy(_P_{# zN0?_n-esqgSWIKdamONWdY5bw<*FAFt3UZ;tU;%tc+;Cpaa!ttcmVpJaHpCRbgqiu z%W2u>_hp1X!(WPerApk)uDQObw^y$<48~sHsV;smom%2OaU_VAx#|e_ozKF3XD-G2 zt4dsXYC7-2U44uPKYfVm062jyBoLIFBHnQ}109oK&fEQB+CAS0shwBYIZRh)SOeF>~-PC&U9VF&==w6xyt4q)sPL3&aC3b3;4; zPFTI25k$*e{R8nbG>DhMrTl9;ow!yhNJs9A)A1%op%p^6UVY=Q(ehVnVIMW4hW`3M zR_&Lt2?~KR=#a*jf;kP*bn|wybo^R+oXMpqYF!{v?AQW}xc%J-h2Sp*b6SY4ksEaH zo~&BF=%EUM@$)cO_is~;$wzUsQ$NMTW6{SMt;Lw;X84h7GmQ`sbln)l}#>1vEl-WR$p|qa+UNli$Y+0 za@2wElye$x7W;@@KyWGkvbjq9TWp}EV?!>F6~&ys7o*`}8eiVyG{n;L5$l2AQWQTg zkVtqq*3yw-M^}Zw7=5S%-$Lg!M9uaQ8G+zZ6xA<~`1j{YmX7{M8>e!D;?B|AfV+G* z2_TN}mPy94N2_*zccH05VB9&(6}?_ZHwoa)`^{3v{NUzR9D0(XNOgfk?q(CMT-A(y z5QWjckeJhGV10_jhA*;V8b8N0?45l?s2@SG!u)9=HXEZX9a&$@u%f+@4vI&H?~-v^ zh@JWsLeNGF}HA?E}kaeaN^Nge@{#hVVYtN@vu5OGyuMikZ z4QYHcj?)nNixFIkqOS!K-!*Mx>G00TXT_kS@3o@6fsSY9koue!Vhtm>6vc-NB(gNK zSvp32U(?_OMwdf<=zGp-AvnRMC>~uPQGIeTOGiw}7FN_c`d*5wg|FptT8K|36*Eds zTvKOLDV4xDZbj1I$Th$uH^joz{6E!)Gz!xRGJ z!(p!Ms=WkLai6;_?vMQHws^}6C&xs*3<*PcYE<1WZ z%M-<=`23*~nSuE8M9;e4=FO`R6or)DGR0cQxkQK(zH+pNT=`4UjVi7W-YhP^9(zf` zaHuQXJ7arbtMMp6w5P_;VI}j|)~E&>gOl1pdvF3*_tcu47UCa|%hHkY!9>f>KvHCL zz;;%N$J%>Hh?dZ=qz>8pxMx3pPWJ+Y=u$hQYrU`Uasus4^jqOH%+3$0S-s>I{64r8 z`M~0DP$hx}ytasj`6em^+L`E93a8=z`J#&MWf3=R7vOi!b)Yp0bA@9Gr-gVovZWhK zerL-#%j1`%$cr_QIP>dli#WVxq(bm}KAeU#$o^~G+nU_6m0dPWA<*uJ`f#M?G~CC@ zzsu6mufSl-I!IFF%Ns}>ZuQtAO2ot|1X>D_#`%NO5R;q{T#7tp1BuP!iC_uy1wOyf3|j>li;QwX#)V-9ic!)bUY&PO}~ zf=gkV?%=6JxBZ`5I*RoePin5O%2DltMEW$8Fue5Pd!r|%^n zSX_&88oa!tMw!n(|0ir^CY3;2IMTS@<+KoS^`wr1f6lN@Ge`;vx)Z4qPnu1%a+SHv zgDC#Jc(Q>suDm%d#GgJQ2na5PX}US75+Ua%SvvYW$)gbDHH)(kry;)2Z*b!!Q`}Bd z&#MsRlZrDAr{R7S=y0~ZS2x#VRR?*r;{3sBcs~k=5`X8Y+a*ZVfoEx0a-3y24JW+5 zax}V|$BMBmy92}GwXbn!1H0u68SlZy!*eGNWLeTmFPxv_vF*z8)rD&ZHNZ8~`CZXBvd{zVj%oR$}$_c#% zI1Oh;KB74gT#D8^fkfsO)*3FM`Qy0VwM?h)xb{UFcJvdaj%B4=Sazso_^mxo%N_rcG}TS$m|uzIcA>~7d6 zdR~R#zDk^ytJf_hhwqGetm@!CSDcosSI3z-J9-7FI^-%d)bb?I=jOuRvJ6u#}m@0iehg`Y#D+od(!)ot0dGGP-Gg62f@9pyB{PH1G! zwc>DzaR!&7`8AN(x5S#y#oCP!zuh;VqZGgY!)YO=zQ4h3tj?yLXgE|MXvKkkww#6$ zuD!J`5zB@TG`JM4MFNS5XROtd_-aHqg`kxa`s{KV;#2#G=|FHPS|J4z_vc%yK9LyP zSRrW5i2jM3hJBQeSPcZ1qLp4C(c-MN78Ul-Dk}u7Khe*U({Sc|$S~VgpSUw*j!MvK z8NEL_EkuzNspHzJ$_AIBb#x$+L9W}yj(b@Yf>!sEoasEIl+V7x0EvMn-MISL92rfnYnm}UgQ)}lXVg`0q2->%i|8DwwUPQD4f=khE zE0Fk3?gzz+{mr5{L3=>*_{F^;((nQ?5X-Yn-v0WUO3;p#d{XKCFtDWhbbR}yS=vq* zrD!i3NbD{k?bIt_^-9)kT&41t*vV!sSFhK9-J1F!C^+dySiN!rE#_!dMPDpVga6es zX>T6_t5+^XHugYb>q5(>pHKv51F1u|e6INGD)>3Q%>r+@g}v3P2g@0U6Lgw^vl^%2 z6l1qMo5-+llF6m$JR*?De^#DTT7f4q8*$^O}}&#&!ZHAPP1^e#A&c>7m{aQ z%kvL5xfGpq1rp;LKh|-M`mJ@GLeOa+uID%{1QBO};8Jw@7Dyx}$n!y0$rcJhXOOu5 zv9tK(73yX!WWRy?q`jjzZ0&=o}E|CGvW~c@RIxvqJnFJUPJY zrQx8&ojoo!RS5E#!P%12aDwIYtoi6r<0vjgzBqwIZ=d(hjh$U}PLQ_{t{FHj1Shx@ zc?AU$9~GB=OC@r8bWV`h6Rv7F4QJYn;8Nt>6iEF1x%9u<^(u?O3G&{;H5{kG1KUUJ z1cFPE&s89?>a_F)3c=qN<}^fa4d0+29i2^k7d=!V$V(GGmu#Sq@y*TPb@o5A^01@oQ5}e7S_-o{*qPu2=<&@2l=Ps&Xm(a^v@!_ zSbv0lEtewC)j$Hw;An5R{^b&jz@{4taYQ%QmucPM{AaZ<9craf@c&Kt(`iHkrs#X4 zgWjfn@3&EJ($e^O8et^@2_5cvJx(K#R){nmT#BdD210nUxYQ{dpWoiPfMcO`(3RzANr>-gTy({quqAL zj}cj-F^zjeOqbAq^E_T>cXXc<1oOvaAMyKBNnkG_Vq~3KR{DO~<3NWxq>h!9rH-ga z!u;UjG3zhd2e0dMDfzkXz|Y~WEzt3FsJUY(=-_|hIpH}J!VAQpmz#DB@guknP7Cps zuN-H9@Ru4>vzAp_l_&+o+=4s9zk<5r1m=WFjs(#{#Re{QUn%;P0b~LWA{u z_2-t?i!p4HvAn{smJYp6gz~-e^H2wV{{JI%D<^8M%Aam;{XYKrDZBYsfzy_bhmGq- z=ecsqN>>?HH(Guk>cG#zs>TQ|CDWmfKq8@Ie@n-yk%!!zShZ8?u&*M0l7@z01ecQO zP)8tfboLla$JSgU-JJMth17B5MBQjkgVzfqxRgwXIs%F55z<#}-H$6%IdNuz)bU%! z@MuoM3V;z@N~S{{fy9VlsUvv)rYKHyTPbzytrH&2X^6ze2reblp^iY}OletH*Zvu= zb0S-k)X}zAcr>Sl-~^YF=}<=?acpKkt37g7I;L|X^qSOR%ngs`v=E%&QZgOt2qa3L zZfEHz8=2GK#MVNxA2&}8kLEPo&SV6alIc)KATh6Xl%*qctEvVk%6F1FI$RHr<}^fs zVg#3x=}<=?F?D}QOUKX?O$<(W)=3=$GDJjk8f?gn;8HRj>Ift<|MkLJ$qfIeo56`u z;*9k>-&!;xn$r+fl@VM@rb8Wp#DNSOEghLk4K+A%DpuaE+x~UjzHpB zY+Xx7qdVgbPK@wK9m8u!L~~jQPH-ui4s`?))wWKK#995&3-B~$-^<5fP7A>aF2zS@ zm3UQLw#TnwpBUY%AMz}@9PXI@afxV5LYhF zb&YG=+sYNLEHEecAt#5xpE~0osy=vo;A9!&QN;~O#kw^zM*VOsEsjsC*2g@1A@))} zh{F?m71t8Fqu{?KAy*?`l{AjWr6!kL*TmR#`Dj|~CN9NkA+F~tZVWv;)2VH5t`N_) zqn=I>J*hTC)!{VU+s;+Uc-Og-YgWIO2A3K=`bb)gC6#EEoY&}jWs~drZ*7cUh935G z$f!ATB$ZIUm(xN_$(zk+(!WAV|6e;OM7w5((jsQ5I%du)V61xmbMp0Ctqd;3+e0PV zzj~oRoN*yy+skeWkr{eP;j)_JZd#9#?F9a!k6!3?W?qOm^tzkDrFaW+eL{TxT^$^K z5~}qIGo!&4+h1Yu8=4@(W zyn)^~38Fx?PwRcMOxWMjVn$rFdz%K8PRyJrPH^8_*N6H_+(ArDQLWBN4o7nJcT& zX!=2W^4N|Fv9s|ZPYJl6-xi|paT>havSu~%o;qk>F`=WurFdyoqV|+a)(H2xZ@gMQ zFWef*cuwTV7wQ|~%5~YR#|%xfukJ6$L?Uoh!@KhsQIOMcleNZGJ#52uZGEra2AASv ztxDW{Qr*a~D#9LeTQhj?s(631bVNR`5dFUpx&sML!%195 zdHc+pI7^p*ky6PW&s#cr{9NgOB6J55oEGA{eiN;7tQd47O8!MkJ^EMb*f^ug|3v5x zBsdN6Md!#>c#Gu&QsrNyRJL_eN8`TL|0hCsAi-&{atBINAxdt(WdM@)P+E<~@y5|sE4BOu z3+P;`$c{apfsSy;<+6qSh=^(N#-pGt_BECB==*Q)@sx!#595p~#c4Q2PK-ASpQvf~ zoXw#SsekVAOaS^Z#B@??x51Qnqt*MuUVCC5olEiYTqX4H z`r(e&D~d#O8b*fw@y49Q7TTLlS#&Nnu94TXvT?X$W8I>D#H@pmtNRVLxRF`(gic=1 z7tO*Qp;J^TP7ATkDol8Ah z>h&z^3b{(~C-UT(XtbC*H)6``*HJ|;dOe+?zjlI{aQu5Y4c=|pCmN@kZ;W`D`He!v zT=jZ-L$tR>->5XacUM`CqA|Dsj`EkHS(NJ&;$W`v_&ZP7+N+6vQnHzBJw_eyBsri$Cfr#F(}oPh*JKyJoFQ!~PtI18X~^T)9_Q=TZa1 zJf2AzAi8lwf1<<2@y5zFl~cm2+V$H-J)Xf=ZI1JQ1uMDYH27?97;m&WQz@lqgi7qr z=J7-xwmDwxR%y7AJ8isSACxua>*>1ArLI5O?J2d!=EyMKpUBf`ywPpzVOPBh(fXhV zyFGa!PD$lKsuZVTB^Ep02&#C>mBFm95YNu-_8b~ubF2)S%hP(@Fz~SA8*|MXo&r%p3(Xr zCw6)k=>pb-UvtKe8Dibf82e%vA;@!-L|5>Ld?Io+jARM{WgdW zBzvW#;rx8jc;ka|KigBYM(JFt^26Pp3ZKHu#zXvx@k_@WIg+>83m=WtPrlsk+5S<4 zqs1Imiqk^8cXGV3_0k`9XLy7{R4C^0EQeM9`oC2gBC(wsZ`AnYuH98QLg!K+Rf1V9 zcZB1!lGNL&9PeI_H=M0=MurWqqwi_t@mzio?$|q4mEyDze;1ix{1o$EusCich05w=&aUmrR5W>6~Lx<6#|HVj)q&K0jFWl>6Apz z>gBAFfu#5xt`ggPa=cmsFSRsD8`X4cKY-&^y7eQm&_tto8BfxRA^;N=rIQIumM5$?QB@8_mM(+2&^Vu&@%=>L`p8jYaQbC0r6W+kMowP63?|go>7UKBY%QQgMGJn zys`Y=2xp<0MRhKfBhMaB%Q>23&V5=TQ#lric;oirT+SflJ-y&Vk7o<~iW1Y-(Nc=j z;0N~#Jg+A`N#6NTB|g6ntMEyh<16r{;$?y;w6`Z1L&{D|E_=PC&ZT}x@_07)fp=cc z)2g3xb@I>zWA^LWN%23I(Wk;5;0DC(FEm+|;xxQ1dt!ny|Jb3VB3V>o;x`^oy_T9I zrn5>zzuF?lE7$*_?5yLXI=;U@0fKwb;O>P5LbAKbz1b`fptuzeP#glJc#O12aVS>Y zU4sOo_p&TfC=@Fd++B;50EOqAJ3DY@H^1-mf`7QL?0Mfab7f}k%sHQ_SW$7e65}Ab z9*55iR&!<@Y-P$(rT6dq9MkeEcCXCuY>mgj9*6LCS3mTrtrF~f#NrhDje#$0@VE1W z)jB1ISdY{?s?5!^-*F&25YuIXo{6!t4~MCf_7n-6IeoW8IZ`u}Sfn%sS9vgpm9SdvxKLY}u40jqb z?)?%CeTMF@V^!n4E~_We>kS|8%iWUv!8`aYF{t94b^DZ;GO@*nm$19nEgPj7D_=P= z=+Crf^{0XlYL%7`e1N|)#oP&|@>1D=FwO;5SQ2_(N;B4L+GJy{?$c-*j8g3#*k3h% zaaq0nb(7&^P4C-oM2@l-mFATm?c3W!Ch`P9sepdI{+5l>Fnj*!g5vwRtJI42A9AS{0D&#ZmW&ASfjthT z;rm1DZ4eWWBVS$4taUj!js5??eDu?u+1K^#W5gCwU3=~ z*%jjzY{YvpRtWafd;FpIzTbg(?7Pl!c7kFra{H!aH8^IyqvAfrzUYS=@a(?w^3z)l zIh*)THkqI;DvvJ{J{0hQHQxk2JgsQtnIP2vgP^Umh+*R~Uc$#l;ltI2b1Q7yMRXhY z$7|lCLCPyo(m8ldsyV%GjQK##2R`qebT+$8j4Zm*(dii|Y}}J+*bNHq zN1;Cl?Jo*?#ng&kQTbZ6bk%$@kfOGXrMgO`kT^mfQwa0a{|6ziv^$*v0ngQEt6<`T z`-9jhC{4vK7x#|@U-Z1bYt}oQY4FXlChgO8!-zf55CY3575n(d0!ghL;Ts)Wy;OTz zxb8;O1mcH{-U%r{WUjN>QM;jPXLTHs6{Q(l1(q+~v`lOQBqdgk+w5rDTD313C)4l< zg5}`8o%Y`al3Iy(CDYo&l0U|xD)D(ZtJmu^{LaAd*S#xS*~B*o9>2Zdbj*XXcEK!d zq2^s5$EYbchWQ=Nl}T&e+vx~|-4$}ib+(OK%c0`U@N zIrGdnna>Q&DiK}b+weKeiw0H(Z4pAlDC201`rB@+Sznk{qgFmJ_j(ZKUQ;G@cO%wp zh*9@+d1wBoUry~Le5=)jSzuq*Q?jBoV-UY1LHT%P|5^*%%;dr~$-~RT) zaEXSmi4D=}*zvyBZ22o`UdtVhC9wMP^~(s!iqbIevng8Dca^k$eY>JW92o9!l>Y_x z8}J<|(a_h%MXTlWU$>0dRaK)_cVG@V%XNQyeAp;AqFPL}`ZDZ-rH@xNZGp+*Sez-q zUbW~L$%@jjLta?4y7KsX%MXWZNW`OJ4o4Z7xtkj}R-!?fqHnaiC}+H7##c2oYIUTL z!%?zQfW6XCcVcF5ea?KtVYl!gpx3*3()-7USV)|LpI zPksaH=n`tRL`;R5+a@q`J7bzmGd7@5w7O_fb7h*b58I>EGr0;`UbMGr)apGD6I(*u(ogP$Pw{BAumR$HT1fjJzG=dd=>{*YROiVW-JJZ zk6F``$Gnz_c7YDZzU;6IJpR(`<8+a7@_`x;f#QeqvB zpF%A5=0itFC87Qx?`~c~ZHuMBp6IOPB+y{$8|1qErDZqt(zHlTs=ksH9P= zmg^mk|GL5I(kyr4)E;OVCM-{x?x>)ZI^}Rw8fCGcjU6VHiqfDI0v ziqHlxg+9FRd(j4qQms1&@44w%%G{-8HENaq&f#!QgB_@Y+=+2dqSXfhFH*|fETxsJ zdC)Owxy3&5@F1yFlxA#Jff&^sSUk0k*;gX4FBu7Qi_<^#IHFW*^2Mluy^E$sh5H&k zj<7o3F6O7w7o$XPE&9a<$Ywe_MRTGe^bTS7+nu2y}eQc)W80D8g<)1#}Js=p4q9l^i;x}(!3b8Q?2;qe;4M~s13 zki%EAKsV{U^etel@0l2N98gHlM|)YZp{$P+_f?HXX);J>WjCAJ$Q_qBM*$V5I@Sqt5*5 zNnBiMG2U9a=D!!?qt~Xv>1p_ju%e?^nb?#&R()}{PEzX*?jPQ!}H z6MjFMKl9S?yuyl(?x{a`qcROqhhKVU{k!=Qt)Xjn`Qn0Ywz}y%jS+HEl|8oEpx*jn zxMF`cV=L6W!Rj#eb)WeO1L~(s#QH>-r-tvgC0XJn8uAC%gc(oCqB`lChZPX$gZhJB z?Z3h54cj~G{sBic`pdM}dma1QDE51OHoKK75@se&{5&>)s_mK!|K;FXH)7M{2zAJ+s@4JnHcG_pI;aU~vft{n%0_9% zLVp{fw%Ya3GQ0dTjan5smkfkr@A=CjHzE#v;2YIq&_<10nG7pR&@;gtz&AW9tYV%4 z5<$OGC@mAzinfC?G48w($-&mY_tz-lIU*CS=ukaMefMID`T8ZZMy=>5jQWG;DxjHB z^Oo;Q>VI74b7Tu=@0Fem<5_S$F^s+TYo=;{j`8#RAQL(E@|n%tJ@!j92yie}`lIJ7lGd ztf6{ODCt++S0<E-X#PBfuYW*2a6Sm`;Qu0^9!O9cVv3+1 z_(pYwdKe{vb74tnsc2~-M}LE6%;{(OIb0%Il;tz@3&K()nz6g9HD!!?yT13LaGhE` zj)k=eC{?Rf?!?-~+{d=X84yrHBq$BaExFnlrMkK_Qa65aSsAr;)m$dZdACuzdGFr) z)iRm5k)5xYJW6z3D;Ev(p?SEEH1OeJ1^zx=-A}~wBRuov$iJY$bZlJdN%~>68%JJSVmaejVf?A2ZD^KE( zv$XNFuRPmCr-aB7Gd(^KOlgQcCj_+;`D32MxDGtS?T;2UVGfpOoS~J-c3WHcU@)a& zHG>e;O60+L64o<3Q!lrgOQ(d$+Dq^2bon#ck%qAkA*hwe=kp{c&*T}0hbx}cC?T>B zTc1A^Olg>nA_TP(d5NAxqAPPU;eC`w36Vv4zVne_N`t~5A*hweuk<7ayYe}={=6fN z5+WPa|NhZnN`ry`A*hwe6ZItKx$;sAZ&>*$%M`6dR_nE~$AT#hn#+WsRwCckllb11 zU;ABwQ3@qQc5bl`$6fwRcBCO=oeNZx)B3Qaa%tF`w;ug$G8j7TPYeO=Pd*-x-SlA~Z+n-h6HZEg_{r z>)z$#QMEZ5wW4L0iQGK%o;}GtK@pkv+h)zPiER5Bmj>8G7C!!+v2R>@09F5CD*l2Q z{rC%~O~$dv?hm>+ABd|iLV3!L|C|1TP`I>Ys?X zV{Zy-qPD0fLC-4)t}`KgWK8f9QW|zdSjQuTro*$_qN|^w6oPNg4=MHG*ks42o&OzF zr;ImhJP>RZA?UIRst0x;HV6OXtBNRF(eSbM>s&e|YPg@`f!AxR{Ypx_aq)%-)i{SRWU-RM3s@;2Yz`` z8dMz#L9O_)$?i#%|FMDLW7M4}of5zI=RWWokkSyJNC;}hkNH=lOw`@;eJWlnP;}5K zLEB(T!ybo(pjNbXmWe;KX#McqI{rPJ<+Z<$o1K`Wn7w<1ZOd7+(c|RmGt$=YgxQHX ziq-y&fSz;Kt!O9!zAroWtkhNK?1smnns;)IVF-P&^j-HYgrC|iHK1Lt(sJ`{a#GEp*+U&#}#UO}I zkxSL?hZucnab_J5ombmJti0m*9mKT)neYN1>tAiNge}M^5w>M!C*~+7Ozv)@G_0Q= ziO~nzT39CR%BoSTx<8wpn4^d*KQd9^ml(b1%TP;>iCMK>^UY4oQMCNqS+b%uW6d8x zJ0pZXm(JVVyX8s4RcEqqx22|*;4ELq-fOY z&ULdBa};0sL`wc(ma|)w{;a{Nlsxxs+Q=JbC*~-2ftV6{ttbuqI`@du-}F420>O9^ zar2hhi8+d6t3^pPsKb{2{T0{WA%iCLlY^z#xeDyQKcEE22ljZ044nVgZMVlAJCYicmsABlYIm|jnS8V zTOzsnX)ldh<(+GGVvgcJyF0lNXa0sBXYh~7G5xb>RiN+t3NipY!v1sgyp)E0mkz|} z39l|CC-%)I5fh=W#T>;s>qTEHYM!f2jNb50o|HnDe6%;a%}&fw9JZ{#)B`l%Zgygh zV#k_&;jLAM!v^+vN3a}>jN_Li;!W7)!E^q;;DO<8a{zecTS&8a_l68&Oy z<=KJc9ce|hl`xvb9L3H1MXx%1pVyDkPX?tW&%7=ZYZJ{*%u$U0DASOSQzAzH zZp`T9J2AyIY89-RotUGzugws*dZc}b)~mkClI%OIq%lH{hqvgv|HL?&mx|IbJLnao z-x{Ac`Bf>Ihl5dXDyI#HZvf0uT=PzR8}L$5nz1QIqxI*1MJH}}AQLZ6nw^-Vm^Al0Hy^$B@D}db zl?s}>l^6%fcd+%D!TO`SgRC`!k7}bTS)G`p`2PJmTk$h|Pm5m@<89h>IEJ;t5(~G% z`|7((_^ZZ>@_4h7H^;5oL>@55->AxmNNA z%3rew>d$?n%v)ES(Wq6wg1l6vBixCui-sF*`?|+FG9VN?5|m~vY_6f+8kcqb9F70N zt+v0yaUzfXkcksNjndB@i}Aa^NhWwNqZlIqN;9?-2>j;UzIl#Dt@ttT$z-Cf9%&GB zdbE@X&vA+92Nx8G(gz=WXStcFiAJsHScLk6Z|C9HlCe~GVUH@WxFF-+;#&N$@o)?^ z|L`#d+Ae;~*XUgY%aDL40|`n)>_^Q+)UAyh^Ey^HesNiS+nS#@(-n83MOb3my4XDl zw_eG_^cY^kRUcAplxD2NSBYsam;Jpb0(?-boIN;k<*qy7EXzx^2ngd`P%115Jujsh z+c0&qF*EU=jgg4!7Ve|+PMKzG84z#Y=HB%m5Y%dBXkP8)em<9jXT(Nd9oYP?fC_5=vdzbeV|N)731~D)g{G7X~xnXUeIo} zw%0E-xW7)V)ED3b{LML;>_$}G(7zg6kjM*jlGn z{%e7NQtc@1PV55$O2wLFL_i6VpfqIBt>-nL-?N@>{Nl2rHJ6EI>l)}|Hcarl&`T!T zE^%F-KN6+u1{pj+blH}}uO<-Gie6Fb547%k@_nkmACzAoY~|%RRd+R+NoL{F_wEvJx1v!ew)rA~IPXewR_BfPg zOx1fE_k8Bo$C~kr%Zm0(GVucP?eGr5|N6S2Q6ANZ{BS`y5X~r@^z8(6w1wLpiD%9UUtIBhK|AQcHEu}Lc;CaOsnOpJf zJejx&HDCGu%)Ts;g|_Nze8Pk6m~l2|SD+KKGbfEWC|w2P8mW5%Yc{}Z)d5-q%u(zX zq)S$mhTa)!{ye)mz|W2FDHY_z9L2#!Wg7ZHC{@FJb@%&2si+mb2fQBQTD^4LLHu9z zMVJXMYWrDRpXXijdcf_7!+S3gt~=;X!yD!91D>nTRy_VUu za}+Wa78eflka(>@!)WVY~}I7W5skKRfuKR^o}ld|q)s zcs;IE;`4A9?!F4b?+l@_BfdFMZFmiQv0{$m+gRLraqi<7z0Sl*2}Qj#DT(u7&I)oA z|65r+WY2UylR9OIZ^#Jvn#3H%JKy>OF#~2f$NyZ{TxfJwiSUPSL(EYe2HI_uhKMa7 zN~`tFLt?Tj)Jlc#LCjH{1Nv|>VS{hAY{%Z1Pqxpg;I|s)D5is+47H*(sJ*R=(Ze@o zu^d_>6SdZuotUGz@tI6Rtn;42k#6n_OxK$$Q#f$#IPe_7{k zDWn7?n4OrT*y&hgqQ{7TZA6WCq3UkPrKu?CAm(q+4Jrk|hPHtztdB3bg zJUC`{VveHifR99jg20w&eP!=5R=-^pm0s}Wg*l3kK_Qa*pfs#hZ;sX{R48p7eM~0q zoq<&c$Wa`hUQnVz4KXHKFJ1Ve#sA-`3bkqk^H-Ro=(EY4SQQ(s*R65c(&S224%Yi2~B;pp#++mL5#b*WFN;T`-Xx$pU&2pw!4TV|_yli%2 zj^e0W?nGEKn1{pnc5P8^U0W_SROR* z=#>T~9doqaXh2s>4!_z8wTit71mq~*?BGrWSB};%2iCAmcv?r<0CTUHqsS`CR+MJ! zZGQL?w!b#}o~}7S05v>%ttbuIfIzfu{4V*{b(t9Zm)VIqijBL7cZFYRQ1KWStpd$|1}vzclsN)x1(2iItgL87 zd8sH3-%-$tZmo7W<>=+I643+NV9Zgx^QjFMS2y2jcy_lsQ-=LpR-slu956dEM{!@g z>uhHWOtE#YSjX8=F-pKwy*STJd{%%iT>XxZRl;tqCB5+<5a}?R9zE+gV>p`?Wx7DeX&b>=3)QXQX_;V%S^NKL* z+$yX{O68dR5^-gN*@-!d7YB+_2B#SdpBtl38L=n%-}u}LwW7}}^#{A3?upR{EUc4k zdzM`(yV&f+9L2rwCF?vvu{z)%F zy%lQJ5mo^(M{(|PcVfx27(M>!4}N(!cqzkSJcv1pg+T$4o|n>)l>!8Qc|A|?Bry9B z-&#sDcA*#_y&hB2gYXw&MMtkP@ho?&zP^5~q}(F$`EaqP^kxV}9e<2pCr&0{P0=+&?EzNfoo0{vl* z;^$Hcb$qP(yX*}Eeu0`(D_&cZajmF7##%wm@#=aHdGA4B_TlHN%V}6qe8lg^mI|2^ zJg=~#qkHNPG-W>y)*Fm_XYCMnL`indE|(wl!gi727puwM=&wh%r?AU0<|yVJ@e;nz z|5_cUj~P28p>*AJiFo`ApPA_U?x{q>?v881jCvHVovwIT!IvKTp#B(J{b8`)cj!B7 zvtCCO`irTT)rmQZg_pi|E7e4;x4vl4)MP(UPohNg9(fLd z^*jRN)Y8l$GI0xh;62YfV57pVOm?)Q1U(bP^>rL)5K6uQ62V(FlQH(8v`kPd+78MD z{19s&E5_DE`bkf_1_TwwEq|5PMAj2 zFiJJEgrdGn;a1)a@7Sv2oF$Z`z`u8F#^2!>{|=E(qiX1jir=gMb8(rVJ}3>d2BW!; z_+pAmt&C$hFP2IsDplgw>Vi)xiSVeCi-vfg5!sA-6tZ?!8=c~1KY8;uFFU;FSa!J{ zSAeK?Y{8y=7MZyJn$!78%QRyJM`qItZ!ErdArRDR=UaZ=thwBYWevyT+64RI$MMok zQE*Q_7d|B4Ex!H%^}yL3h?99UEbYpcW&4NDmWg;IpdNej-m*~|X5Aur%~Kk5R*jOt zxv(U(RJ63PYtK>*=fYXH#o-c>UV@iu;Hp~^&Di$kn)cQ2-|oGQjFz&sF-nzpS)^+G;mLDvTG1;i6Ngq9v7GEz*quv6X5#LLBCZqn^Ab^-d{;zDP%9C?=}BA} zZp5Urv3H|XN{IMW+?R~fpubB9Y9-=OJ&9gVjM!Q>u6%?_2@z+D`>RnJG&2c7twaQ_ zCs8$@5hKht{S&5ALc|N>K5>)={Srb@D-lWTNgO{|+IY|VoNJ;|Lc~4ees`2+j1ts} zAM+jZWTH$5BW9bKTh>%5A>y}j-#$u1+fE2-B_g{$iC4#s*mIWDB$rAF5r>ZZ4^kR> zH9}A;5pV8EC_Eybedl#jp@fL1$9)tj4J+h?pjIN%-jj&nk^QX6^C*Q9A};{ zCKBKA_J0$Kv1cu%8N(bb><2ejo1=(~D%=;Bo>yd7;otv%1mE$N(y&iMz4X+dK?~8vI`~EUkvr2b^_zw0H#$Uu9!kp&2Dl5hOouBs;zF(OWcYx>~ z5@3uIFq4fR^WBrzmf(NqdoOQr`B)9R9Me+Kl2F>nA5>3Gu{0P71U(lm2`wS)d;&gF z-&XSL?MBe^QW_$#U8R}>gu9j4X<8<_0+Fz_&i?YBYR+p*>w$!zA)CB&jB$0BLN;K0 zPFx@2`Fz};$=GR{|6ODp{%?Z&qx5GVD;)B`go>3Ic#fB*jxyo8hnU1xr+;xI2& z)E4tn`8|OB!{Audoad!3a1k12fErIC&tAo2k=6RcQ+z^sL=q@2x`;kN(DG6%T0h3t z0#W@z!-S2W2%eEiOF~Nsa~VMV@YOeaSGp0@2c;qEg_nx$2EyG6-wCX(Otb~!<>L1K z_261jg4P@fK|^!`ytNG;Pj9ds@`P6}sc$?#6Pgx*vHIui%x2s98ysHY8@Pk9uJ?Q{ zlL@2~^ZVJ|X~zB@H%9#!5#}G|JwZ7#70+d|pE=OdMv3KT`QL}UK-IeP;A8r<{QH_i zsVE`ZD9od#^ruqAVX3GUt%pnu*g4*KKNb}DI_=d1i*q%s3D$bw)rQAdLOfpm(Bgd3 z*x$YkB4}Yuy=%PsA`sLHkE?Woozpys zZD&-&$CxSAB%(tutFsucr9wP4r5Ss6QdJ-JE}pP^hD?lh#Xz2W*uh3=#%dquKAz60 zrc*0C&fWv|5cVM6EGui2>Sd=;i3qO1Yu?wVgN@RRQG#0G@%P{Q+dYYV&U6L)^MT{S zbV?L#zuj|$qJDY@vyzs zId2He>7Hw6qcrT#IlZ=$<;a|*Q-0ABu{w;GYGrCW8>K<(-MTR5l? zdk_a&lr&~P8lE1n-iA3=e9u?MkFZS{VRc?}_}gFa8)3u0N5L`vov|wQGg&M2h)%lt zQ6_>1ayosdOv7G{f7iks_qcx!jaR7^9!J1=J&C%D-xK!f1)O4p$fJWQ`nQqcp58wQPmgD(?C2NR?XQaaGMf17gqp*#>cS z`zVRH0r$LfiogBauSeJ@4a$*Y*DAlH#Uwpm{GCL!vGGzJ%|F6MX;ASfvfuErtl%(} zTH*2C{r+}OqG98w22rhDZ;8lXoBQZ9`a2t?L9fq6R0o1u;c=avuuG)}Q8U&TTZXuw z%QlyY+7Kgtc@sSCA0lj&hG@g_zUsA|_4e*4BNIy?MjY=)?wt`fN`qeC_uNP8(#=(B zg~yxL`DZ|6ZDuw~HD-MsiRhZ2`*@`fw^16RKM6stjN`@rc28n$Q)3T>IOp{IDkb)~ zdV@|ohuJ6%<10c?D?GkA1EOp^h`I;+8}+y`?r((>Pu}rft=Yt(HcG?wBLua=;|Fn& zGwMNf4>I=Qjq99khC+$i=@w@tSZTTpnZ=Zb9rBdX>WR^3_g?>Rxv}A{1rD>CDv6o-LTewMz#nr;?f3!Po{PGC_1HENp$zpu2 z6#IdxG7Xx5hf@q6uOG&$)C!O91zR#8vi)U@uj2m9nNO<6%zrFSZx{hAnm5o!>jV)H zKum2Mo8WsruS7h2YH^-|k=`E2M4~ifnSp3Ly+DJ!`D7pU9>djzShWwJvrK82JqKd% z+Lj6ZUdcY_NRQI6d!4HuZJ|`u3XjFOR31q6HdtzXGaM5o3yXM2k zm9As_rdk=y*#AXv+GKa9;Y--A7(Ny>t|9rjbAtOT)@nDXv~qt)%LKLJ$Dl^yK@3<{ z%J88lH&rPSb%p!bmUVA1r9l;#5Y&nv!Mc7*LVjjz!OP{6ZN={7t#BIDGmD@5Q19qW0T#J z7mMzRka?+0MyV(b5vFByuUxFI=jsFx4$UT+Epr( zQK}_Ssy|^IbkZo5{puEF`i;WY5p5$RV)8P+28lBWyiS~E?8c3SO5KWst;JT4ln5+U zeo#WdYei|8Te`T#sCm0~5jwS^^^l3_-*hwx|Mrm*Q8II&vp9?ZcCfatd&92+v{$`4 zD&9-a?u~C3sZ%R@eW*XiiY)Y2-$!^`j`!-KH>(!p%zh2ZKBJj!W*A?CEIzP_EuvA7 z^TsQPlpfaB{)NnXTP-gh|9kSmB)r-v)oSY%b9-w-k`B_&4{m-dY)^Q!9E! zsXxZ{>sO7Mp9<;cK`0RYi_aCMVGq#K{0s6f+;jXzSke0|6N8kJ>cBEvQ>q_prte!C zjpR7P14C+xd4eMlvx7H5z*co3@J@Vs^ zmSP{c4?l>f{ag}G&@;haLL17f31w0(4dWXbr4qy-xC)Cw38DI@tH5d4$7EX>_43YK z)~m&v=+p|Y&rygf{(PkcQEqDqHTbKJR@kjkZw1$Vwk^PZ1+F{4AKZ%4j76_1qIRpg z-df;8ONn?o6lx3c)NK!hN;G5jo0L^M`ZTkYSRSfVEBf?Nf1pFZFOS;oxo?tQw}V9V zhxfypKfpe{ZxgqteMWp9wGj~U4La!5ioQkEA3Rs^ek`k4DuAsDlUh-3rP%Qu&fj3j0PR#%{iu1T-Wt`C-$9oZ zeYdGU$h^O_ML9a8wxv3>)U+R@_kg#eyibH|j%xE2XW;^={c^}XXFT*iYld6wn?LnF z;tqa&Ra4s62v6KKJzS?&w6~=GAgUPpLA+Kz0lXhP0J-xxJ48#uXOI-*@34ztxlGFT zw#8CU+~<9*AO=HU+kGaK3i?_~GiG_%N?BbxF!|h;NS#{IUSB3sJ7?FiR7qPpsdSWa zGZ)Visu8d;n2tCg`|W=ciX90`!(3m-LmK+H5k5razi_K(`MHmLuQs?5m)jrGj)a}x zZ67KV8zHI~+xDBIRs>TT#tb{^s}CoyH?{8SrOr8I}((J6|9{%g0LPf!edqb3%9CQiu;(7dr`&&%b0*zS0E@2^X;t$8Q&lA^T(_F z7jAW^AI@bc_Uv63e-U9a2uj1c^MyXfvl}*foXUUUR`f~y62fFWyOf3~Z+P0_TCv9P zwDVuM6@9{GVse{Ub#cKd2|GJK2uiP^LT$O4>cZ-H42ll(GTFwf{CLO1JTPV$+RB*s zVYwe>M3@YM(u`$4Z^Qw_SuW2~_%GaQ@xS~n%H{twI75PEOqlFQP#RXl`}Z^6D8DLK z75)pidbyGNsIcim#stflFxioyG-DH@S{ptZ%qgVuU$_-*4KgHH#)Qd^?FXen{hPNX zac!V2;lFSz+7ijc>!2#?m8#>C&z`aAbaY31GCF32-GNV5H`=Q;@k$1SYt%=^zKop< z=j%~lrB~DGsHl5?esyh$0n*s_|3{eYNKl%w^)>n0-H>V7bp8vsD)kHZ@hDsEFCt8K zBq$9&ejQ@eeCwQp8vlh`&C0`{@aQoWzlbo|k)Sm6%4vKpb$-!a8vlh`CHZk5!R?BF z5n-|;L21|#dW|sy$+{Non#O^m_tskKVuw+q?$wc-%ZBfVW&SrP%D0HvU?JPE|xcZXcHUh zl=!0>_fci4@W*Lb!6F2;;>RYtC(-b>m*L~qqHa1RIL1 zi`9eZu_Far>bUw}4b>@eEeH4UG{hW2X^0Ca1hwMFCc7u0ujp?0NPRL+r$pxPQ${^z zn9L!RhM81CP%C~6ErSPfutX&GoN@amjn^r${KRjDk99T8A(V#IS3*!Ler&RP61gmg za0I|&&c^DLSXYz#_@=%&gwikyCj_Aw?(kJtg`5K1#f32McUO?FSB!JHiU*0Pd!zR@XR z9?gAho@WlBG|b!)f?Dxoh==na-j8UG?*~iE=PSME?aQ2pdYJ66uTKa+R*YkaHcUFmz8K-wTa0Zgap-REC zB3HHcy-Eb64DP2MU|SqG1DX4Wk|C?%7>P&UmkdeDvBiNikk`hS1Y*w=FMK~3%s{ID zWlAv0{%8IYA?y0=cHj);0&9s7{5!6`K%>^SE*H1~c-ni0JQXs4_-B{Ri==B z9t6%5V$CTHkxpOnIsHRXyyn7+)?6kcLrUr?hqt8UJkm_oGeSy^H0qr? z?`svWJI*I&gX_-k2e+a$Jtl zE)P|y6@B`sKgL#SdGtete3RPO>L3xPv#fXEeB!b@^1A}-I6Ly_XMuR=-$A8T^ev+P zV6_k4kB?O0nZR$e&%_K0<`hH`le>L#w3Dzt~qIT7M1iAj~IL{qzoU z8ni6BrEBA^^-Y<*AWWrJ_|D^e;^%i>5K~rq>kr=!O#aZdi`oHN0Gv-;1uXzA6{R7g z>V7Vx$N8yuM-KvL3b7uPhQ0~z2e$1$!2Q5qgcW@UWx}4>M{m5qlKN&=8;LOPCd?Fm zzUQE922Va@zH}(6xBbIA_3fCJ{0_RT=(|n*LC)yKEn0!rwJqJC-KD)6y$7_11C{^k z^R)+=3Z(kxko&>;(6-}zVh3p3DGf8Imo;r|QlG@KGs0DBMf*OPh=*PcuT?hK;Trop zoE^mej+TV?kBX}woK!B8cBVtI)RXsl&nbw#&~xH^;(X{iDGfW`K5nIj6c0>J+!Co$ zE82(4MB^^mjgd_6EuC~aE_t`=sL_9<7qf=YF$&Cj{7(Y*fCPfl5V6(%kb*T28#+Yi zzi_LwT@D&P?54mkA{09klm=zI3w;b9JtvRT`7hk+)v;8=$MWC5j8N=IP@1tkZ3h`6 z--mPHKfRX!^hAMUq--p8xWL+cVe851mHLa`%3X;@u4>VvIMT&HHUNHS)j`!^gWV z^)n_|#ssXA06}TEN(1^CKDt)Es_|dARV(`TxQ{}UYGzEZj0t#R zfS@$!`>Zjt=$PN_ElL$J}r!?&QdOXGGKkhw@)s=dCjO#P2luyX()q5PB4*1(g z74r$fzZcj2?f7@d;JLgzX#Yx|#0B2tCE_ydM~*GrpFT1TksQx98$RBb8n06;JjMuh zPvXysB@Lq7X_+|n?Oq4Qx7!N(gispx0Il~Sx%8yyr0bxEOnqeC$4kWu`Gim!zUa@@ z!d{KNJTzXXR(Oo@?ViMiP45h%W4>64Xpud^f${Cdiu;66nz3J2RMuK%iAh?rFj^x1 z>%`|AhL`gRp)^Eh_GyKE6#IQwq)x5y7~|VLiF4;?8^p2rQ4-;`Il+PP?Uif!gisp# zsKINseSWb?6_$M`5z}AsQk}H=gisn*$qMc_d<^m#rc*0C#`tzm!mHg=gZQ;oZ;6=p z<38gl>DSvQgwhb5=OT^+L9Or@aSE=ogIe59{# zFJ0JgO$C{-<>I5I!1+EQl!l#8MsgoDsy5fD6&_=JyC;#kx!EXH&$V?V!Y_vV@H*`i zLTQNjbrHRQpjO5)#J77AmQb$0`}OSn5;67y_ffS_p%6;LcRC@c6&_=JyC+fqXn&&~ zll%OwQDSk~MB@%V?olX&(v0~Lf?DA*#JR=GfIO} zZ_sGHK-L)vD>BQ3vjs0z*BymIC=GMR!Q4l$=hHQ6g~u4*?n(U9%;?WqmU55MDDhiQ z?&DilIE2!S2_h>H)C!L=zTJ~3^cU~Xe|?@eZQ0;N$9quBDhA4EoQC}%!3Q3nfxSTR z7<%PD$Ll?IblvwnD4#?m$0a&UNf!ILUy4XHd~<@2_~la?^!3h{My>j7!g?t7m#nxO zQ3MFx>t+3HPxDH|sD(frz=+SHA(RFkFIPP--OHQiZWRXFWavXCChX)j|LIw?Ap8a6 z%|Bb2jN@!;6CIcbS=7Hc)O;Nf`PU@WpLv86*vlYsab=ms%k1FdaU2?z&yxfp!`N@h=4ez>H`9@HYhw-Cb|vbrOGwQH-yr#_t_uZhjl_V zm0IC3=0SQA4;S!xpS3+gB_it`-s4nC@eQFgV}e)>1hv9r%!BkK#{Zsf^lH;ahDpQ^ zt+)^W+rA-`hWJDmF%<}Eg~yl&=}FX%hJV;MsUd1j(%{P~cln4#RC71_k z$yFkR(y)%Rw6^vn^rxf>e$f&^*IOtJ*XmIg!^aQjdL!@k-Eyh^1ZK?4pwZdbOeIyg4 zHwY5_2WC-;-TF^=d`_nXXVDqVL1ZFiP{DbM)%T z*mFvR=yx&ujMAW)>FS-&mzbeYE72o+5Qf&^uM#0f%a{R5X?S*{xR0^ro2%4HjEX&p zU)%6;d&$n#FqIMo;ESabe6f538M&0^Uo3y* zFuqtMLVO`%o-m~$F5@!)D%!nsluE6{myjosS#4#sJ_q(hN<=N!*WDV(UZyncuePYN zwtZc6(nZK#rar{iBxXocnlWuD|AL$f8Pe2Bd^LI!=Dc4S-<&5Q3!4&GU0=eO=}l=^ z6RwvjCA}BV^rnRPD#k2IN<%(QN#koft`}sJQ!6|c8RRli*fr`K_$+S_j$TFXBW=}a zYX@XV>44J^uYx~UY_YQrM zS0apYX)w>6q%>p2T=i&tKW~t`mB@pX3I8thw4XPnCI#0RrQiAcekSlte6~z2yFbjh|Ffp4y!V|&(2I44B1YU z5UV7ZS43&}#_85kYj?7Y-%H5(p;mPu*5EG0NnnfQDh8XvAxD_n7}4$&K!sU;I$tG)HQ>jowl>DomXD~FiJAXfM=Z(=R1G?s^z#y^bQ zrK|nZwe`_`Q~J*hlZeI;YcLYlIa@*Q5~U$B6V_7Ge;JUHA99zd6)mAm407^VgZs9A z9>hV2PQjW}8Ws#b#~K(l7gn_9GV%3}5_;s{9jx;MzShMWHfGd_89~hX83b$Ii(t)r zsgb+%#d|DA2So zs^@#)otkf4ONkKc&X~I-`*6V8wx#oqN&Kwyhk;;@}q`a^3vuGTWie?d*$LUf)KHMn2Stl&|$gW zN{iim+}wFOMn)WlX?oFA$Uloz$Af+)~`bso8X~=7m;b^$nx$GbC8X1VkPI zL23A|{ti{rJ+fLIDq%PqE7t2VSLRCy zo;O2jXxn)l0IupQB0>PqE7t2V=jTfZp8rE>$d=`C04)6aEJZ{J;CaP*J!U(73BmK2 zC=FkCJPv?GHhT~xA_VZfV!a;kpiJa!7ppIsQ^r5!*?oyWBFYN?{)u226DA`&lhW`d+|G!mii?Hp zGZANn=M_;;m}{9K!7?Uz?i!_G_lS!|G*w(9$f6T*R(M_!^@N#v84@gGg6H5-8g@Bu zZbVbX?SgDT5od+x6;V%^KbRrGGA4K~A*C5hi8rFDSX0Pq6meE~UJ><#d5~X1@SI3W zgPK)#Bbth>gX~NZHHGIDQBRo9`6UF;?W8p1OYmqa)&a6iMVu9$S42HwUh0<+JV%w% z5bMmNsaQzPHmZoT!t>Hr?Mn!rYfEWRFpD>$sn}1Q{ZtV(g{>uRQDwqf+S`~Zx(++* z(9uNh&IyjWFc)42Gy&;Y0wR8A*VbCUpOdr>Gyy3g=H5|vkkX8OQ=QMZcP5;VG@C>B)BSvT9cH9{Bsvk0|;t`$3mS_CRQxsD?g*Ug-V22 zH$u%!N`rn0A*hvDAMzw}oa5_J4<}dCDIr#^Q2Ue85MOdc)t9o5epwgDgjg{{eNjro zmsc|P;j^}yPOZdRnkTW!wRX4fepZPPD}ShyN@-9K5UYJaP%E(}=t=xpgs)oWEa%WD zAyzO^@0HT9yNZj*0R*)YYnz_L{O5f2b=ctU5+PP%QNxzfuuq(ehya3Gi4|T?Vzp~c z_{gzlX_OEv$EdkWX~+ctB72>S^#ZQS1f3D2H1wPAo+R(y;DK2x=vA?L3L!oAPYH=4WG7N{GzBi%a$eQyQYE z2tlnx&Y&kTu&|NU$WkYbS1BPf9G8vQ7ffl;#3cl^61k6_M8j3xjs9cflW{5~M5ZRH zi%}X@GYCPgL=LAXk$0z&Wy%VEHB_a9$T@zfKCG=N4i5yNt zA(pio{kKF2wOEX~qclV=6M|X^9a&GJ57(__WoP8qDIrvEF?NvBjP)f1wGw)`p2UMD zhGH*UwV{qq38D9kF_4so)jk)o5(sJ~bbUREm>5Gxn3XKoTq131QA)#CQ5^S?T)MeVt%L@$ClMKHs5G-b+V++Rq4A7yuapL@Fchf%n(I>+JrtAlWbthS5|IqiB4J%vCh10TzV&)oN2KG}z%((8)Mq%>CrPOtQ<->_G*53cviqdzIlwTkhc--S|9 zD?AploH9|Uf;T=Tar@83s9bjpt|;UWUIR6D{1UDQQDH*KljqTw|GBpESNfc!RuC0N z38BW1k!O^Klh^2C_-G1|XVgll?t2nbbVKDo?mvibqeOAoNdUiu!ytl=(l9&dzg20k z%}HYR2#FB;5MY!ZrD4XaxuG=~w_{YeO0C2W1)fBk!|6snj*bnJ2(h06MjKKZ)OrX( zt;9|Xo=Aoc-4t;8-NowuowCIlfpR0Y$G8ezGY(gv>X^69rx?~Z*-v|hzcZ4dvbMS zR6G$Xg7|mFC_%0GG1o|ui3#;jXz1gRBoX(D1Q-xTJdA9^&%7bzKSz^ zc>O&_r^FBo_kjvDlxB<))QTT-%^I0_-|!Gdg~fFNT^vdbt;~I(k`AR|t%wlRiXU_B z9hoRnDbk30-46Obl;~ZM`#?n?O2cd|A*dBU<{CmWk+7sYwu$T&=oC@n$Oo>Jj><-q zW{eWliXU?=B$+6%BE|4A$TU=^MBzu=2P!mC8paHSpjP~tYdXoqoflsCMzO|oy6Keo zh}E6<$J6D}Kzisbr$p@8u02Gp04tDbeIt?gJIGD9sops1-lvDp@j-JJo1+ z*@IQpbV>-tf7JA%H0%OS2x=vC`aOx9Blu1NAM^X_)QayUz;%Pft^%kh1W{rC2SNQ& z8uWd>nWy~SGA(I!jZrG9w_=nYY6x-NQm)p6dZrkq$2EjvPhM3@T->^Ul-f^46?2SX zK@B0H7meyLsLP6x3S2|TI)SU0Cq5TrAFh$m8ar{C?tS(8>qKdKR+{N zENBSvu@5JNnkwr1P#Q*JT{N5UFg-(+THxMDzvUq*+!@@q5??=(8k8NzG8-kP`4eR zvmKYqTC7+TwHK&yV_aWnP|u+RJrj&eR+U%v{i&9Y35_HI)y9Pm52YEK;;5*;KQYPj z^eJqNMyya@665+%Lr5kbcCDh`e>gn(^?sZBS)H2SuCLT5La3^osZmKiv+7uK zn}ytmP&4A^l^s#DhMAI&~INhuxrZ1giw`Q z;q?(}P1GO64mK*OR@%8G<*c)r+6=Bc#`V4EAZp9cOKH%pZBtYo?~^t4V`NK-5c<@p zCnNhP2O8L&V|OHj2DVDA=+h??=RsjS?CNB5Y=aIGfokIz*M}NHl!mC6?RnH5KpY6@ zpi(RP7Rf{d&?LXRYwP|htHPuus%*o%&(D`!S#w)WZ?rcx`h55ebmUJz~Od8^io-j?WZyQq=S0$^OgXs@;3Ae@C6MaYDN1#nGl-fg+N1ye(Tec&@X+)=3Vkq zOheXMb3Wlcr%>4wJ5(%$o|Dpy`QC1&ym))eTzPAxO08%gE)%C_R95e;He0F;3XxhL zdPQm51#^}sxHj&`cqIdZzvq;Oya|^!Zh6pv;Jyqt zq8iDU5L}sr(x0_)?-l48Bs6gGyh6hkRaL%(;0i00h7~NXjmxTcd633`;Z{Q38r5OG zgy2dsl!lo*uA0sMy);V`>ezT*p>B;TH(x?<#T!b0Qq4vUY>ofIt%SNYs`Y#c!IgU` z&DeCVn$2p?DWnT^Y&@?}w?@^WFCn-B5v4(y!ll4J6SR+0Pc`Xrl`?e>|_y)<+enFCpNG0fN$?k-|0m*A#unM4aCwA1p^NPIy zupTn8z2_nAk6l~#{We%8#7+X;%gHq4zPfz)gAY$Dlc9`9{b6|+ySlfH{`2nz^-S#2 zCuLqd7P`KjULXGScX-don}Zs!?WniOnMAmF(vnNpmlc(3d%vO2psuosOG89B~nXhI+(gPimZLfPSz4Uz)p>xVqFIsKb2U zCU9Q1k$QJjQ+7uW{nbq8#^5# zaD9^e_;nLBsGc5c5D<}dy#B|m-D&Pt|Btfs0F$D4+ISNrh)PyTN=8)j1@4ZUVQ&=_ z6QCpsf*=w_5EVpZ$%+99u6p+F{`c{C zKK<<0Z{AMRU0u`D%QcEzWfSH4O<%Y9$nemk^}7Wn;cXkHDH=uP7`J0osAjEOv*fj^ z{IMx~h4Oy-+)Zg_IWiudlr(^H_3z}BsggjNpY}pXH(nn^56UACdc)ghs;E6lZ8_t_M#wmjMY+s!w+{R(Hxl=E*2XHaWCMQJ)6 zKeJuR^^Jyyu9?!$AePS96mGRX+5h`$lU8cTy+x8QQs2EeVw~l*a&s8%$Izoa+Yb-l zaDM2>P|u4c4WjpKI%Shu@HCxSBWr=qHDlPVz1P zM`>!0h1V=eACX=yG+}THgBaE>9BxUun!m`Tsji4f-%u@7b4UwYTFG3=GSMmj#cQXp zS~@$p;+JRaU;o$`zIA?*zrcvnPOcD*Dl?#T+EXVthD%bq?o-Ish}~9lm;b&FHecP> zAT|~Yhnszw>aW+r2UT#egLL z+<0%vzbpSw@@-?s1&_3N-XM^7#Ql;gl}?kiQjdRdCjFD2s|SNwFFFKUsa+exuM#o3 znwRKFM6o^9gI{}y>$h$U-(D@rf1)t8fuPA3ef47UfiWwyh7=iPXgGbzIUT)Jnn9~S zjve0c#HepF-#o4feTI6ev_o4qhA&@j>Yq@cw1?QeWli$&F)LHYkjA;MHij=mn)>UO zinc*i1A2(uq88{^_^Px{en8Dly)E7(CXmL8b4~rj>1}11LyA*Vt|tEZb>>HuD`_Qj zWfIRVP$^%I8)q$}_L%YW#_$n}Iwz&->vB#&;AD36W7=zQaX|Xn$h}s=e=ius(XTg# zyHMUAy2YgFch!h^D&t;jAraEbTMMj5=OOR=EPdfMe_Ac}_ONSJ42R#NsM@l>qot)Z z?(GL}3y0P9P5onUDMPs`Nkp%*e_HSEHi>Wk*%)5^U{nA7Q%#!A(@!~^{NrQ0t?LT+ zp`8P!6_?hjtEe9R@?zO#>CG!IvEJS>*dXej+8D0&B>hU|(^`XRia-+4pz0Fq==Q<3 zwDQ(;HZl9ek>q=?iMNN*D2fs1;;dFe|uGCX%>42im);?O>t}r#tAU3rK zhxeUK^lu)nHJGMf4ekAVa)CPK>?T`U+tNz5npwL~-c*0x$3H%7-0>`>W=}3$ z&meZu9NvST6~>Lx8cfq$5JYTW+RR>Ayq+zsylsHqI`kr1d*vG20v)Yq~RQH}l z|36=74+&?a;Do=M*K7(8^e6iFRfmWC0TG|~e!<@P?;{3rutgX(ij=Y{9J^s-*X$5%fHH;aRlKc#%$oIYa9VSz4qOeU5VuX?w-FM$KC8 z8)g5}^}kF>Y&o(iT%D}!?@XHZ&@U>U@=~i&cAK=BsnSZen$)BBIe)00el4}f?_HO`1kCo*7o)@I%>dHQbW>8&0bzG`C%GMw*F8iKh96{oapC24w6{c@iTJ%6uk-_oL$L9A{0 zMYzgAI?;pn1eh9+?C-tdFPa1CFXXl2)-;K04)<+VJ#?$xq2N6R(WCws;aU3<{gWQi z8cZv-qvR_okH6Hw-q}4lB&}p$f<`uh+WMKirLS5%@6;7PWq)q*cE@kSZ{>i%e2%C6 zbhb$S!zoK^bhm1JF+6m+?e_2}@~=A3^K5A)Y26-0Th6kIRvc;&pX}S_URTnZI6aX-5JGrnN?izfW4t&O9EHR-{#FKI(Nt|=ftV2gZj5}bgtsZZw@x? zHNYUy$0WgNovR-P%nFt$H`M7@{EfF3_;aNWFKUr8j#l(PuWA$8L1RhBg311C*XuhK z>rCvjK(6?gh;*)Io-H1FaB&BNaC)L3nAW)pUOgFXc=GX(wDQ)1L8$vDr-l-5xHEKu zW|lAPWPibxb+iLSAm3-%Av@%Rv~HSt!dWNwHuA;+bWO{ zfjZ9gK^oC0oQ9X^OUnLS&HW%LtL=jJp^3#x*z%hS}-=lNo(rR_}Q5hdoOn=OtEta&BC6{%m)V%AiP3l51{Y96mrjC0zDT0{( zn+v--rA3VW%GJkwi{~aq5YxXwb*GZI-ZUZOyL}@=RreOMBvI$>q)2_LpZ2I9DhJa_ zZQ1%#;?p!rfB(kHRIim=qXtppo-v8#DW*Ryxtk>kZ`-)ET1@45lVbW!O5d6))vr+A z5z}vZTX#=6GW$>3Fo<%MHhE>1B#_2+SMBZPlQhNp>J7@MN-_O!?rZB1Y&CarQUo#m z$Cf|tA^N8-OR7#W{pA(s2LD-^6hTaX(7R8%{c7g4zP|U@B}EX^Z$7mz)ozuI?J~+z zOh5EyKZCgc{;`t9$0!l0FUt5K2kgVc9d(DNv-73UCTLcf9@t?phOo^+04`p;f0 zX%KIHloUZsKaEN*Yk__rhlr0Trhnk$l0j)DOKuVCq)p`|MaT2 zle&y;wpQI_4@p@`T-0FUzszd0V0AbZUm=r-we{Guq9wNQ_ znWTo-wG7>GscPud)}#nx`tQts+9@qYyO*vG_C39g?qG`P&--sM)m7OS>SPR}nEpdA z-(V1*Mv@|k>F*x@ltI(;+U|YR5!0VWPe#2~Tn^-x_2`u5M|UPYH?MoB{F~>3lIXrE zDT0{(kjn!d4VP9Ui8wX8d+5sIb3th(OD=1K+MG(>h+_H`FVIOFLjAApNfE^KH%uMk zDS4@hlhRMp{DePAAdNZW%8+M$lBVZ_ElOn+Tap-B+@Y~Uu+_3%NfE^KOY|D*Auiup zFyld5b&VwtpxsYN5ybSD{QjI%TBf0g+4)0z7`4asXBH=?P=x-qAuSBz;qQ|oi0Kc0 z;#rec#fiAIzFKG_5zaV)~D^q|a5>Xe<3O9n&|6+WAhzsHiXf&xyP?)_X$7L)`a+?`V>^eWmA9s|iFc^vE7!~peoiHq z`TgxsQUo#mVRc7%NcQz*FFFKU zMGhxLUM1q<@SKRw^b}x|hfqh8B8cffd~$?O(zFM1?Zx!wqgQ4Pqw!tl1Zk`$u3R1A zleALR-#eU?+~%9icaCdv^%CWGtx3Ok^vcu;q%rnLQUo#mjv=y=8kEM` z0JT8B`c|%W`tARHkQyIv5{*d%G5s5_cxY9La+UVR*O_6;m9#Q)CH2&tr4stOZcd26Di!@$sn`D;VYjdPcHnY_2%9lp)BgJi0MCEFWO%zjeGmT9-4h9rvJzI=P6h1h&Wm1 zPb+h`NgO?x6hTb?%eBLGO-E_+GRhxLA5AOaTWKZiwQ@^~x^jsx>Mcv|TxE&%#E!uR z(S`19#PnBL`kr@bwUvmfHI`VtwhsYIJS;t!L5<;t3kz5YvBPpe9^eEk9T?`7w%vzel5}*UBxe)KedK zE1G#{r`mS^X=w&g_s66NV*1B#)?=_st8pEEPk)VK`a3^s9g4&^lZv7aO#kJfJ*gZAi1>zL`i1^|#2{L(PKqF=KkxQFPRW_3{XW*w z^b7P9ZWE29UMs}+9KVf9o=xm{drI=%6w`m``_%?9i@Zt1^!vO)o*wFoX|=J@l;n>n z0@;rukTF)=1_tp}zfBpJDW-o%t2G8OC^IR7nEsKe{XH#s_L|JKMOOB-&lEZylvc9+ z%{G6aQWJy5Vx1vNOKHTcu@+G(^?akuyD6q$=JEfUN#eHoNfE^K zuYTg8)w%`6Ge%NOKOt>qmb5ZjP3oz~zp9?BD5jrCBPrJ+)_?lfU5ef5!~ooH=(?P~RD#yH8x#F2dfiWL4k8-UHwdYLTro|%C6^aWkH++EuN6id z=VX6_sP)~Yq|e6mw&$+fZ%JYfl>;&TX$9N5yN?JpA)H7XoTQOGDOE_xa z>Zt|Od#Bf;n7(>vzd?+9Eh&PS{{5HRX$_`T&jZzy|7!fKeW3OpP0+7oaD+PD{~zhcl_mPNBDcqiKAO`2%Ne)0whWS7-c0G5y2Wbg+L|(KLdX{-CP& zIyqr0gI34)Jel;{vC8)77Of28+8>)n5Yu1y23^_zgN@j>lzw_1l}S~CXxD<*GjfvcCPN~y)&ce<&)Y}v@+V6a+OU?Skx!ul^0fK*)#%`zpH5kG5uvFb;;o^U%l#g zG`=Dq9(CwQsBJxqW;NVv5+~B|{&_axrhx>$dtqhjQqu5RaoeD#vxyr&zB%*BeZ^8I z)9EUbKn@YD=N!7UldWO<&ZQQq{gP7-wlZ3cG_r}%!GRf%(Y~cg)JxV;naD#w`B;2%?FySu z?Tnay{l&VS-JGDVXzh&q-;q!g$88RF?KQw4(8naPv|6w|+S{hjtA+xn=yC*5^ehXLQ|HKeYQovO%QL=!2Mk zhmZ8=!!*4i-M__#F0==75{+l&&d?W^bKO&4^6Y{C#J5VF@0NFd28C$gGiw8 zxp#sWY7Y&~+cr4-QITYSW{VnWj}#jc-m-;y#@jX0imKP#&uK@>`|qWkB0uylT0wfP zx{jyS_BUPvBEOu81mnjJ2+3 z5E)T|t)BR=UmnCPir`cYtjvPfleE@&M-Xhac~IXxh}lGZHELz5ye{j# zcD#I=q_qZ!ZBYW{fK`n{PdequnK(!#kEb09^14W)rduB_YtUNb7eTPq+r4_{LEKI) zxSf0xd0nJ+k13NTX{`ZbTa;j{*_V3dK@_Lx`4;kE<#mxp&+mM1sWeGzjcbYcJW8-t zt93o|AcoUD_!Rl0^14Xl4qmh4hBQfQ4ce9I5^Obb&f|Fy9cg6v{O0={4JO{G^|&+o zym`kBX_BV%eOh-**-E3&G@3bOPLRfEH)ZzqX_D5ts`py)(28Rn9D=Qa={@ow_C0wr z_<7l$2647q4`-zQ_SWmuBu#s33wKT_MI-ev@-k#jkj7l%-*8=;q;;;w{22-EA2Yxq z*y>1`9(fSq^X~*#)*fmQaX)r<=BSVQT$d(k`bC{99aD~v8yDdR||42*ne_GO$(5w(x9CoFND0zD znU>L9u?BLr;05xKsjejLy>EjvK87OIjN~1EhuUF zz0{(eQqECy1wOUR3DS@JOTUpz{Yuh0SJX=^?j>x6p26u@f_kFGJ&~=@U!TgL{esln zCGGZhi+ej0P74MSoqJHyI#+Z@S=o1#w$gV|Zp6{oi`#D<<-1l};ocraaUYBfl2)o? zEoWq~d1O%0oFG>n%1{)C#w$tdT#fpnlHI7H9(~vfBMzryiGeg8(zxif2U|holT``M zxGQO`Aqlp^$jRwgf<|haM{2f$#^K%x9j#$EngYtU?9^K8IYm;pE~^)xYv#;QLb z*K-tGL8DFm1ZN(UbT)A|O0X4XGET=5G;`WK*RmBfJ}i;o%+!+B8ZAfcI+kce_uyLcG~{)W#{G!(horSeLqV_= zRuG(yC8!KG)(3j^ljy9rqz2L$W3URNr~2>S*zD0@al6lF9Sj01A&gg8M@d@es^X88 z?2HQcg`}0tRV>kk-e;&vPm%Er<`1kh`!^Zlrtvw(W2|14`fyw2W>c5m>b3nqa$~BMsvI2ZlJF z%!7aH6+P3m3u)7wlv6LQ%-T(-%6qM}|KKH{@{9Il4B|q&AyH386HM!pe;HVrI+NBp zUMp^Yr>>kxA=*6dxm%hoyV5wdZO|l;L-;;i4yLun2g|Op?xK=QE7>!kA&G!vw~zG3&j2wC!+2(A-oAnJ(gO1)SONpRjJ9ZN_n#Er2-J^zHfKbVfy zkXDErWB)ER@<~KT9H-<_I#z@416bkN1Wp&rKfz<7q+>Ot6`mE~O_cl-Jhp>iI#xqk z@mnJKC**7tl90>q11agR&4Ce|o?3|GyfE2!wR(M{AH}!HP0K^ceX+&{A zFbz9%^f9dHsimT~D03tNVDXJ4bdM>ci6{*_Q$t#zhvQvTN5e}5z~UQ8pywlsgU^|U zov9(MaG&Gd*BpreSbQT1+`(8C;d7>8XKF|*j8}N~HAf-<7T*{IjaP`t;B%&7XKG-) zVk?Y;c#k?qA^_I;Mi3ZLu@c7TOvBF9kXD#K@CJE~L;x(lkpyN2!~pO))37r&q?Mk1 zbPL810kF7MEKx$2+?mfyW#1nFbjh7>v=!!8E(hzu&dinmMiZE+xg1OzL;$&xR(NW~ z?U5tl|4 zB*AfUXfPeCA+50Mp68Do2}eT`9N&iq)3F-TiqAjFm2fl+BKkA~1kzXT=M?;?Beb4j4y5D$O`)3F-TO1E>R{|BMlUwf}i$7)C`^jG#1 z^GBc`BWi$hFdeHQt#IG5zneb-_amYP&|o@NLt0_{V81<|MD%$rG?tcpOdRV19ob~6N zV-tOvc$gwAODV!~?rdFWt-p8cIER4$F!k{uW+^Rx8)&YLUD?a#kH!N?)K=e6z8l&PD#THQ|$4~_cab|+r4u)Zz_ z6Y@%01M&716fcp)j#;-m{sU_;t%-}>cUy-jUgEXl(xTq7iR=1wN~v(&X6v692N*>7 z!P}j9NvDnDJ#__@IekuAGbmmnt-LkOdP@1;?ws;iq;YD)@F+L7gjTCw^Nwg_BBvHS z{L;$QITV?Y?TobcI80iXJZ*8~thrGQwnERqvm*2isi)M|eLp7$My||yC91&$G|&^d zUoovUIEo{!&}z98pUv+Y97>TQNuV{c_XF)OY1%{o(9g-U>A6}4^(#prjk^nNE@_=B zJi9|LkydE`+zIb)5nLCoiQOV-b4e?e*kn)g(eAs0JE>nu4Wu!y;4YH1&K32NAbN?k z(!C@%Vk|vNec@R4ZV_A;_aJtQ;2xATow>Yeckm$cTvPL2yvg022Yt^U6W zcee5)vGNHT5Cvxt=1mbJuznjeV2Ax*z&qaqv!Xp8^cE z>@UG}p@EU%`{Wd#q_xJQM7$m)*y@RP_46R`EDF!03g6nu83*rvD#6fz9>zy}uGF4y z9#5(9dGXMkO&ttkz}F3&5zhLgsX^;pZKLt(DcZv#tz@obnKTih`|k`rzr#0}mp)E! z=-c*GoSVkym>EhOZcMqF^x?pivNv}NzIk-GUF=vBXI@%0uaT1zwvx2gi0)`Kh%I+E zaj$D?fZ0rYSk}-JKd%+nk4dyX)hA`=gPVh82MsWYm#oIl9Mxh}oRdSQb*@Iy{=}PU zXN|P-woNwCCE?HHW%T~waC)A4^Ts&GgACVisINYGvcpS+rY3 z5{-Y3qp>8L;It6M*mq2CG2VJdsw7*0W(2xYDb*|=W zzulHrvfiMPO}u;eiR6!a?6%&cUV;|H^Ez&4&WTf3GUi9MwThI``oHP_qnw4_861cPUSdH zPs8EqL7ja#PRo^^)+j@D^*zl9l7JV68ifys+GW}#yjHmr=q2#_BmplBJ%hb7rnLqW zUaQ=Rp}Ow|B>^uC{gu5lrnLqWUaQ;*^5JZFeUg9|hUYEpoiVL7nDAQVPGFx5ygo^2 zFAR01y)&k@2KM5>>+@P+mrb5TswCjU;kxk7(B@2Q4UFsX`n*=T6N9S0VE4cAQA-l= z`aZik!SVW_!L(8}OFCYkeVV*JuN99tCV_k<4;*U05;xNz;Ppv@)4CkdHn*ge9J`<) z3G*p{T(KZ#g?Fk!AV#L&srJSbCBbVo5KJRiriQda%nEO;|38T6Dis9Nu^R9VI8uZd z8Q#y&Kf$YQ5KPBvNGn9Sa56#u3C!Uf{bD*+Lt4SJz-bH6$UkxQs*X%C9jk$F*b2{} zxE%Q-Fza(Un2yzuR(Sfx?U6qMb34b#n2yzuR(OiY{VJbCG=}K(k|-Uk!Lcw{;b|z} zAFP)*!Ly8{V+m=6r@FZB@=x$A1A^&T4QYiv3^+9){{+u6AefHTFs$eqJ>I;}KY=ld zXSM7%@4aJ*w8CBkoFL$6MD=2GB?+EoKrkIkNGpC<`~N|RIf`jlBY+gH#d8r~7w?=q zpEu`s^}QvR1kW;(j@6J>{El;u1W+eelHfT51kZ^@+R!MqbQ0N?PGQ$NQDgh#_1JN#G7BZhD_41&fh_QIKt)nMNl*Tp!9cWRN2AzTef@R~}}u^Q3}<2l|~&XI66B*Cjj z5KPBvNGm;G`5lcI!qxB+90OoFRs-L#73NniNB#(2lcO9=8ye12WN8J@g4-iU!nr>r z!BHG&Fl}f!gtUT(#QiEq!pW6EM5A2LU^-TVV=u6Rr^ok4j)bEj369B0I#xqk!T;p@ zob?RC(U1hk7NNnkK{$0Kt?;aw$EzF(M?(@EBZUUju^Q3}PuX#{M6QIRAqkEMgJ3#V zLt5e4KhGaI5{`x>ILZwTreigv6`x3%E8%DuL^P%kg6UWdj_LDtc|Ok{0X<%&q8y-O zHKY~lhy9ZL5vVuzOPG$;kXGm!>|f=NK>KslfazEbX~pX^)LZ@txo%_H(Fo!H_*Wp% zJc3aaZx0}?$H7~iG{#+b&-VWyOd3}X7=*sAw!%1w>q@=635<`NL#7QPfNM!BjDy%S zfzNX!oRUid<0JM=fMD9ta0qFIaS(eyawVKx83c{H*wq1o=~xYnqHKk65PMj1B^(V& zV0^?L77$FwYDg>e4D7|pm2fm9fqvz@c~2Tl$7)C`^j8(A0kF81By{_iaR{biXKF|*^jGZV#Fb)*09bq@3G`#^*~aHg!_L%@ zR=88KCpAYR02bd!0{0{KY~ypLVP|ScD~veUTbm;h0E=%7f<_|j#>VGN!_L&e=)+bR zIk87LM^P+MVs<#Mndu59K?f1?S^)LagxV+m=6^&q!L{s^qw zxILJT)sR+LXL7&FCqe64?lDZqYG9ShR#-3d{gFQc>uA0|n2yzuR#^A*eV#u8@c_Qh znU2+vR{C8cJznLHKwJZFdZWKF9jjqjMc4M&6Ok& zXX5#T=~zNq@!Lnx$R`nfD+vVCu^Nb~;hY-2F3;!rBalO$&yg#42ewgH(h4=oeo6ia z)EoOHOvjePu%fsa`&aoRbdS;gmF`!S^gAX-IiwZ(EBlH0Bhd5NPh>i_9MTH+9s9fa zBX9?^zsq#2hP1-?!G3!_2^xvmBWF5R1LGB2VI1W3NB#(msJ#AQI#xqk@%jw?IDdp( z=`jrrr4G@_EkkKX%7OF#2%px1>+%fO{G8uS)31{J-XQ}gx7<(9Q@wve4dQF z?&P!n2=>q5g1xmk@kG)}UDKvp z2A_o_38dMdleEqi&Rg0_d)1^>g&+KR5PS-hB#>smRMJ`l1WrAXRd%AVGq&V)k>+)Rq_xH!w9j$}?X#3t8{YBfLEx;g1Ug+z5=irU zN77n@PZyI`q0#<42<()_i6@dk8WA?kaFW&<*!Ri=TV2zadSY%w07Ny~6DP0BdYA_# z?Pxdz&Pb6~_qW#N$eH+q>I&zVNCIiJ2j)RZYYjfNPFl5Xs@o%H0%z&r^gT%+t$WNZ zX_D3&IIj<5>0h3t-NiMO^n+-C&Nc4g?vY+k<|M+ zEy8DgIM;Pnrn(l`8_*iR>QmATV%{EVe?f3s6VK9aEsQ{3D{dR9r_?_~Z^_(qrEwNc zBasAh2#@1II#mS((^@0CQ`X59Tgg^4iOq}N%eXLloYjlQ6SN?oasw+aEz;~oX^r)B zx>}j^&W|LZAqh@v;{E6wZqmwI)7ivZ&&|$wg?7rGrPEu{f_$=#%n8!$KWYtn=f}bc zv64WK;k-*)6MR~aw320tAp$tj5hs{oPL-=vndTL;qY;SiXfz1SmU8{cv`Kiaawqsa zGD%>zl&eXmwFVPjtK12kM~2y15|}OJ`jcs`!6%q`t#T)@qY-nhB=l^Vz5ZlcYhZsO z2(Oh~u^NPPx)^3>Nno~w6|Yj6b~N1c$h=m$6Er(Jr;AAfv!z^rGOacE1T(Ky?gXDM zCJD@za{bA))?mVGl{>-bkx2rxrCfh9tu>hNTIEjQbg?xw-%0|rnp}S}tu^>OGOtzc z1kMV}q}|byz%0tAi{U*+iFG&Wgo3qY*0;KFN`D!jU@=hyiMi0PPEJOlLGo0&5N)qa^JR z?g%HXyrUh{^gCF3b!TC9hgBS(ddYd`Xe7p9#7K3n_D9dNl!RWNWydd#as>E1OKBy` zB=zWbs*85Y;Ilum;^h-UVZ}K?8Z!=}!#Y>A62`m8wj{8Yl?11CUGdqU(n^*|>S+x= zi?#0stRN8cmhtZrX)-pTHTW!6Nx+KFVs%O$y%PO;-Kh>4Av%loo@kswT5)Mj0xAdS zEY@DpSOyb_El7gXI#*qyXR%5vS#RFjH6!%6pYe_XtPoGaeo>?mzjF6e8&Ne$p!ebZ z21z4VriQdaJPG?={~rY1Mc63~g6UWd^ij4#JPG@E^G~2JVgD`&reigv6(UgBhn#-` zt%iNbAefHTkXGoG*iZfcBd}8%1kd9JRjn61RgQ#{D|ub4Ik?9#9jhU&@T8LOj~od{LlRhX^8LYd ztcJA06Ia}KsKXoyM?(@=dGj62bgYK7!gFBk_kl)^grgw|#2K*P2L#ix8qx|+z_D*B zSHjVd1mY#ww*-ReSPf~#`=N3r91Tezeue#4AefHTkXF2}D_6qNFbIl9;hi54OuHHZ zq?~Vr6>@_8a5)kHVhHHrEg{a8{spk;xEo+XTA@a`y%&}cs zp=V%!Vva-rEWVKh+8_I=@j275Gc}|Y`YZNX=12s<;u}ezA7ei?K4%(sriQe_eTV&` zIT8V|_(l@AAF-brpEC_RQ$t!|{J_4~9Eku}d}9zaUSU5qK4%(srUphIw!%1w{ku65 z0kF_g6x2!O>mlEBP>cbxG#)37r&q?Mkp{5cZ=u(+0& zz)op=&NS>y4Sd5^n31_0`6Dn>b2*rf)sR;3EVw=LN5JFY_Fy_zLt4Q@;(nD+f;=bg zF-*s5z`tTE_=$XftaWA{t4ue=X2!B-A`?3NGsG2`z84!P}A&}FdbW0h86WI_OJ3s zpvSO(g_K0(=4W=ucxF!V(EEEk7{sV2TRP8JaNZKi!L-iR5;~h|7sbN8 zxspCS=TNEjn;*^i{IjmXCUoZ6J8fG!PfT#;6|T#Kypq=7)2t-Xu6;|FkhCV~%(EcQ zJo8#{X-&fJ(1fHL&nBc5S}k|tRee&3Qx3L5Ya-5s_LsC$A9VUTeG$Fi zzL)xy)Ige7_mbAR;*;^D6SB&~DB zr(Z~`l7m|2LGbApl0cfrD@kjO(iEruj^fnP>fJ!gJP17bpfwL@*MfV!;bwTqCCuyz0r(Z~`K9QDr z5YclcoE;E+UC=yJOImAyI7iP@rB#i+7=85V7r7FtlHeS|FOhV%22Q__R(t=}<;a=9 z=@M%w3#GDC!&M66`+4q&S)`<3YTUsq_qwgsA)UgDg2qX!l z*@u_3*5DI?q}8&DdSt-bAchFww`=eetMus>&N#^H57xkycwIuj$-3n6jBmFVw_gc& zFo=r<^$3SEgrv64)!+0~<|jIJNLtBU#S%N{G^^6|d-3>&S9dpVXyK;uIj_i+n!b8q z#uw$fS;3>j?a|>D&b);4ucVcvb*}i_C`rU`Z{c27(hd=zGtaEm^yJ5D#r0zn)~P-j zyB^$Zm7z1wBvEm13ulhPSy&*L*139#o|56rGil{*n`~lP<3H2e(bL@*X>=&Cx`pFG z;zTj$x?<%Ge$hS!SQM(QcGXzkM(|CVi% ziZjm)f^rC7gmcKWE;&vG_R~`tm$+~!koZpb^gb z)ljch?gY+g#Ho&wz{ntDa!hLtKGo4{l{>*FE=mF;5q8S*c*V3*KOQ`sPG_Elw$YgA zwZeLU$H!~}`C3Z9i(KgU4hEs`+H8VpU5-HXY(r@!+dsCKER3FX3ttWD{LF*Xa;2v= z_}p4azzai-^3x2aHBp(`183uUt#T*OOW^fM0$vz;2Cuf6)*8`X67pK*PDD>64N3xD z82T$m4Vcy%(cT{PTIEiV4;O;hCkgme@~H#US_1@5N%LCePGF}j&ODQZ_QJBCW-zTa zK)~zsTJan5=p{K4sgi&f1}lz6F`caeug`0hJHaR28U*=me9|rF3VO8rvyJ2Rg&eQX zW5pwmNg!W*(k;A6zApSWNpM=1gU_v%R&wluh9t6MeFfEC_m_;2uK7tk`H45BA&vM| z>>E5@D@36122b9^uXPgrr?*`1Sb@O1uOJXx!tZpT9A>U0A#=raEFrCscf5t`Xhik$ zCio2}E=TM;y!Zx@ExZSZw9H|S&9K_rM(=M& zn%`tLG!(v(1gy}`lFosMz8M6oG94(gJ*tL7;3)v!<}nDT9C*Tm_bWl%vOC#re>|1J zyPXE%&GLjoe?ob(M2(mjs?7;$5=5>q=UkUP4bTqjkl4 zvE`5io+9F1GH5XE5&@*}4eFh1SN25iF)raGyab*Pp$+gk)3JoK;u_7BaB?LH9g{0% zw7;R@5Ymc!1~gdDAOiRX^~3idTj6tVe}ix|B%y1%-2cdxwBlCFHCK*?B+z4cgkw53 zSJH~_RA}T*poDk>5LVnXkmeo}t04*8D|ok0(y@fJ!u^PQJ8uHx73WHh4Csl_b2S1; z;aZZwh|0a4=~zNq$#Fi00P1K+LXXb+u4UTQa0zK8XSLi3^jDnLBI^ffuD4hXN$8$$ z(y@fJ;?hbzmk1z*ZzO^Hk#op&EFrCUJjazJq0h0vEG^Xws6SjQq`6l@!}%BR67sr| z*5Dy&CjdaU0~104)hlYmIM7qX@mO=(R#=Re(-HpmJmrHEX@QW*ZUZJOpSS zIXPFLwMMDcUG0>sS1oDvZ`+@px?&C1(*$XRpn+@g2mo4+aQwMab#_czL*)pe9Fjm9 zZ2%2PySWNAqg+WV!t&tOfoN&*OGzj;WR}(lG@4qK1{E^CVo4HBSv`<=zwdCR|^g2$zn@75nNahigS?m(G)5 zzullEp<9r42w+_UD|cNZ^_U1y!f6lJn;&h*Y)No2J37+8$S`tplrIoy+Ts=u>4QCZcXCzRrc-}?YrDF(b<=&~e5l*h; zeaEvXG;+KLom{c+11m|hheMgt?GZoN{&~#6YNbI*Ch>J^*Nb0${`8%OAVTH6#$EGq?Oyl^DKuX*jvVxTpAZP>PlL< z_gzjz0GYzIcm-ixmp*szE|?h_lHj$7LB|l%${n3^$`$hDXs{J>#cAZ$B-n4qH`(f%hM#EU*3rn3AlmJ_QEg2-i1R;+5_+t%dxq4@l^|LY z*=g#2A*SH5@}5MbQ6}uVM;ddju@f*rRKQEX3cDsHjjOvF4uNqAdv;-koLsru$VsE; zW52LLIIBBJU?#(ETuB>*qk*xVbAo=%<-m9xyZaN@k_5kFfX|tBH3CTC8;mlX6SN?g z19Lm}^16hR0D-v{-ykhZ&Sf$PM?(^r4X}S#(y@fJ;=Jdd!0dzlyC9g3)sR+Pqd5`* zu=ob!F1NX?E3QLB!)ZZDU_?dFz?GPeC8U+C-5d!gSCY^pwf}$AuC(I*id?atkt??a z@rDzuFxu4^GR{e(onqexgcaJH3G@uSgC*%$4QYjY1#gDsO(5@hM@?EG&2+4WBv1=@ zi%!z9gtWrQ$tCAnaESm?xRxZ)Hk?DIT>=S*Kri9avK6kxv`YkXBGCJ|cA1VPq!sRM zZkreasFN$KKQPK5C*Dys=Dnf-tR#W82;YND$L2~}aSxYzF5x5`4RKwpMR+V>I+l=D zJgVVJITB9EF^XcIfEAA)Nb`tlXv7d0OR$q%(y@fJ;=YuB0%I5Uf`ec>Rzq6xotig+ zy2AYoEAAOcbB}Q~0!ZN-NuV`3S4_te(u#YA)N=_W91TgJk8$lXodY4Pc-Du8B$WDw z{Htq~3L&z^-^iSpM1h;fu3_It5=f&jUA;QNs5dA3?2!ef6~_~ECZZZn1d?;bG-hY1 ztu=BYkazCklGcR&f53^PN-LfLawG!e0~rJ~B*AGnSBOA5<=}5{UB07`=Ff8{pdkrP zJ48&B(|Nx#dR^46)KjY4uxV?k%|mE&d0nLWF5+B)*0~~|Iz$m+C$h~}9D8LAl!FO( zJs5z$>y845CKQcL$E)GE4efi4uEgmS_B>SEb%#eoG^5AMM;xj?+l;2 zbPT~>F|4>(BF$rdtcE1mBRA+64feud<(8JxZY?kofEuhM!Ty{50R1_Hw37Aa z>cPxd(My8;QfRnz3?Z##?dDFfpNQ+a-Xx{@-gGi=l!N^?BPT@U-sX~E573}v$|0@X zoa9+@Nw8lE4VRA5kXEu5awpi6!FAnPhSJ6yWwfBQ;`s`6?gV>eUJX}UmLmWwNw|KS z%wY^6t$189^d#Z*T}iN)3BskB2vEWyq!s(VITDUNzHxnLd0k4oG%jrPL`kp@pQAq@CQulcDHf5CmIs%rZxU zqqUY-IecupDUwY22;IiF+Q)HqMjTr};JLy0JCtWiBU+43d4;P}=9H$Aj{oP%`)~9Q4 z0x>1^vTvQQ(I!Pii9q=@CrzItt<(r21~po+_74xS=VEDxKGf?2gH~!Z5&m)06ZQ}x ztz@pGo>EhZ*gyM|b(1_q?JCze8sBVu&?jl7MiFtx>o>03M})MJr8S8?1zIJb710x& zZ=!WI=V(`_bLBk}L-2JfAuVzdsWjo(Q zt(GSAc5>CJ(sBaIkjTtp(JmP3zTyZ`p8lNjQhKOUW8Yk|g-YyAwT}fx(QB=D@Y2~D&xiX3Gx83jd zcBw8$9H~ve3!n*Vkw7ShAPsj+jE;{=o!Iw~)7$$DC~xoDJlH9D@omrhO8-5;Dfwfn ztIzqIXnd}TSM1WOdwYn#Ug_)59q5jdv{EBUW5ahT>k14kZ%eD!di8TO(A!PII-qkk zxt~cmH01;ul2)pHv<2U!7L@rdQ+1$|EA_&gx*Sw;U5-2n(f}c8rC#tq?A%dXrk4uc z(!85<-PV+o=A|BU%i(-ZG(M+OBkq1Uba+Jnb+f0KguJe#m0Cu`{wb;JrV$~nxPBh~ zce0_U)X@iYt|pE*35SlBL()n;8yy)+zPHPg`JMk{AE!(!X*Q7MQ>q^kHy_@ywwZ?r zB+*?<8kh|vt<>zO#uGF$#8?pl4U=el<|fQ)0s7B=dc`wNPBxJh=RKX$&gVqqbEVo2 zj8AAiw(uG+A+IZGrFvHF;c7@LCmqd|Nzf?jj8`AiT`Sce7)$p`wB$0kN=+l;wu&>? zOdvv9$)0Z#3yEkk`fNf|55YOvn|X&%($2W+liJnsnZ#An zSVF|5lO`c^B59>kN#hYBMv#WIivOX%qj7!tdwnL+Gqg1R0uiU_)NI*;Y_*=sbg}Z2 z4*e;mmCC$VC6u6d?tbC2K*B$K<^daXS%B+L}bgpD|K5aC`KPcx9vIQf(Lm3rZ~-1*1ONFQ7~wv?QZsa%h}s@PwvD7| zWFVp#wa0;z(=BNwTg@aa>LndWqX+d8Stnd?LyAxK$y!&cH}%A7q|wep$Prc2G%^rT zgowRFNUO^uX#PNHXU}w76M9Ou?o~cij)>CFY%_?T=XY`2L()p!`b7EA#X|9+w}zU8 z9BU=5)Ze7>9}#7q-4>KqvJFh))0&mnUQfCDiR!CVm#R)qZc%LwuULAVN}UarUHcbV z<4+P_Ufa&0@Ac41-AwKAELlHCZ7#2MY)d_dIQZ-WpS%*CY(%wtn216iLi(SQR_Z+> z3Q{@#q+TMewCCNxzp=#$pGj=IOhl3R(2*0mFT77x3y`xd?>T^Dmc>UQj3B^fcFO8yd zH7aZR=EbMOsNHi{chV@D^y3W)=u_uBgsf>vD|Jt=^7aj+k^IayBUh8J=+OuLO6E|h ziA1a?jddPE`qz?H>W7}?Z9i%3B0^fN8%4ek<-N%2PkbhEk?Lv_X}nA=C`&l{_+L(G z(U)Y6&^n3;I^QSs7ZH6=6m+iZUH40x*5^@;TWIu=MDf+7+%`8gHWIOqa&;XM(n_uk zOkzF}igI;|awUmd8rE_&rlel=L_e~KK;JDz8q%udg$52$B5;$Aump6ph3b!b`&iO= zk~C!Pc6eC#D@Q}rv{GTZ2hS5x$wSC>jii-&i!?4$t`aC$(yH5Q_c^&LO}R3Oy@4ug zF;ag^lq6(1B&}5N>r!j4ko8dyA!}FCivGEK?o_rG~L`u z|8K%egTOx>v1JWh_k;VIIeG=>f97g{*7kW3m%8jRXp`XU!fL*yHRkvJES3nch9s;O znke*~Nt+tds({kOT>oZ6&mmlmoQN)&KU2xGX%N|w?d#M`x>I$%>$K&x4S&vcl{bN! zmb8;ASErcz)X_jru3Y>G8sfbs$W0Ar}N2p-DU8iWg{raIo>m&sYeZ3 zsWS!Q?F&Toe*2TP3udK67R<8!AI$mHH)TjltZAkErD(1BZ=7B1!`bVk)f){{B5yRb{ns8kV(2N=m0EBTwcz}}-%F6h)=nvr zEuCz?FYT~T(n`HSCGSWjU)=L&gZSpZl*rfr+5Vc>?Dh2BD%9RzQoE<__ZhjWF*7An zZKmzt9G~TrG)0|D)BX2PoPB)GO--d$tz{{ZTFY$zv8RF_BBOS^UHi8v$ ztI~Ble`(%P@=l|8JC*upD*g3;y_g`0AI79az8hov>&^SkxF3}wFUG!>TJhMxk_pmE z)|IS7dh&BayxsG^IOiVZQ6J;(tLIZ9ubj9272l6|W`j7o{%X=`_Fvz%l92TyX{FMs z40ljj?mse}aPzh?m!6$x8 zxKMaq7^B+pf$M$Os*Pdz3`sOHY$+QG0ykuvsbV55YLdO^bD0_`P_nQzbum(#+W##>~h0O z()0^Qq>)7$Z&&-Ji6kDnKN!ZCIJ5CGgH{SLpJ_y36wS$M8qEx{7HDli#2g}S=#?H{ z;ZQ~xquQ?KfB0lAn057dnfTDS3vu?xOK(~)iRS$?!WiLNbU$OzO6{WdC`auvcj?7= zX>~qreHf$Ntz&=p5XEc7hjt%|vzOhtW8K~L*M~8xeb~jclC;y?L$r>vAFH=?jU>KH zUlYa%_tu|>JsQ=D$A>mkZ!C3PjRa}+>PxG`811??J>((Ut%wWt?-*}adF0j&f&Qz* znEMV?F|8!6R4=OCF_f#w(j{voao$=L##oX}_q?oWrEV$~AKFRt?M+k5CQ7TlpR5dH zEGakT7Y}iX;ut4M<4WP**3=%gB8*x1zk*@kueYxXW2WxfBg?n$zE8urgMaJ3mwNjh zMdL%6G|H`iG?GvwxFU@E?!fp1#&xA0{ZbRPU~y`}eT!SJlZ3pkS&rsZyNjuI2M*tv zD6OWCSR2OJezwvELr*o$tUMGnijn;%Qwr6Ig`y{Q@nv(IMh8OjCB|Rib z^XC}Hl)7*=E_9kkpKDfqmcZY@gPc_D(=cX(-4`RCx_Xq_<27oJMIXPKAgyFgOFi-# zPRE71R*JVuzDccdG|s-1 z+{7S;-n2N}@ej*C_1Hm!rl)=Hr&`CR#@pqp*0-hAMm0jSJqiX?^R%*wl2U9=2r-9wOTCy#zPE}kG-bG{Z zjfa0T^puLcF(Gx!`wi^2qmm5bt-@O4>eb(TlExgM0!!|!YcH$b+?G}aRc^%D=j+%_ z-@4Ndzq;J2HE)%Z_h0+|xo&b!j1g4|Jx^z`Zm_2wHo!3_Wh3gPK;g^{*&(D&UYLk;`e4H?9org+bK0o;)Xe^ z!dq~$Cs{a04?abzl?e2Bf7{qh$ zuL{3>#qz87PWU9PRK?*p+5KK`Y;V7`!!oQy$xWimkUI9{`FGmW2P`*;1*8$Cp7?s5 zlSaKMwX=U6yTYP7?e|73x1^Po-u5+|1^yUpr& z`;WDk45Dz2j~tE7HIDftt<*Djp0aB7inFWFq+eeYR&tgxiNQ}5uuHrjXFr*G#gfGE zdLQa?)II8xG(A5*ea8B?TNAruMsZtO$@$78dQL28pD)qG9^6zJ#DhncIT{cBa>OTT z@~M{oVYRuriGBIA;RpYJMRvHoeTGq6sl^oAa;Qp_Dk0H1|fYz zNz*&qtKJWOJFJ~OsP^xcw2~vINi3{2CfMLi7dv6>0fUg9tfZAnv|9&@J^ZBoaFMV% z`Uo#vdgpZRdFIeyT%@bL^!X2ZqrCsb#W*j!gc3E+Mh9IHCdx3vHs%ptRcGx*&E9(x29gdF1)drD1r0 z4o3{)@$c4#CzT?)kV#Wa=JedGE!PdQ$9}xhl2&pRX0Fv1eO@S-7VK{~8jxuaa&DJ2 z#WEI`4ZgXfx1G4_Yr_MOJ;Nkg4XGPUNa$gYXnM#XDH8mIoKE*S^TC!k_x?iux!&&-lpK`r}pMqFZV8T5kn;8J9*JvkF&E zuzz@@c!)YmLa?>4qMS)DuHiGg^Ptm{}q8+ju<#G_Gvs#MD^$M#y@Ih;=heqCr(XNBx_z z!BdV)v(8xYFEz32tt%dqR&vE6S2A=eMTftw+h;YgA0A%RATp!#;E7@ze3GW$O1bll zwPQ&Wd-n3;A!#MoH70T7t&;Z5&ExF9&+QM6ny@OoC&l(ZRc5`f_-gGlT-R-#?}uNs z&-m8l)zpIPA1h`5ek{&zuxXD$v>CiAoYKMeFPXW)pq0A4TPeFE5w~sK6O>k6TCWOk z9&P)NoX_wO&ky>`@;^vk#@QmFS~GP{u8v-3tes`~lq&@n*IQvS!{Xt2{a>!bs zHx3J(vi|8GXHR{{M%&s3<4oNFDuYDDJ5#1kwHp_$Z zK4|>!a%bk;P-m4--Zx5}C!+HSibl0t9xSqaRk+r-R1v?e@JT{mNvU&0JVF{PNJA1? zYgUDSC7*iW$Eyumsak_e*+158V#lW)3`#56&Qgz_H1sWPZ}Y|3&)&AjAby{+DqOdo z?Z4dI+eiywM!);sJ z{#nDr9^%-93DyW&u`FF!#~|dGC~10baQzf(=udHWi)(9#q!mXg@Wjj{)}L8pRXa=` z^1{jnA;(}zD|L0j>8y{M46s`?$qdR!s*JbFxkRZc>n8+nJk`;TuYEEo?>iZ7G4H|7 z!3n`Dzjw4BtZx!>B$BjJ3zkd>K1~{hh>%t?ienPJKbjEiexjp2tcgj;-Y#j{E%N?^ z;6JB3+TnU9jZsua(oEvdcP9j={n^nTQOhLc-6d(-9ldly@V?_6?O&UoH10te5j2T~ zRPr@cj&5-#Ax8;GD|PSqmcgI4_OyFE@U1a2$k@9{R4Cmd_-dCP_CH(p8H60WBu%?s zMy3Xnmh`ks)cnC1;bbo{iF++8IAB!|`#`1r1|dgINh@_*Gb?!QnjZG%^81aETJ}DZ zXgK{$){!Cu?2#%fIJwm7@Rg@6{~xb?=#%|e(n`&pdnT*dH3RHmQInW-esy?l8_R#J z*HVL4YD2?QSwA%zVDIXb8I)G?8G_WKePmrvW%VpH!2a0EGKdDzb=1~P^L>)0v-`VE z&ni%Ru>H>V#X)Jst1vv9Fo}2CRSAte6>o29v)npG&xf!EeB!?|zVughx_ZCAd>tmG zMBw$^vFkLA)FWRy7W}?af_=>+#claK>i6@shk@vlw;c97iM#E@nxIWy-<|JOHVC;J zLejKP=GRd0gK)<`LF*k=;2PYMO$^_73Sf_?W+ZMFS3Gbbjo;gwJ@ ziHMFK;=c?{Uvt+HPdQf1Iuk5KUSD8caa&r+=koIDnNnYO`a4*PyuR0l6*Y+4=WC79 z7mj$Ij1Ip2OfW=V-<(g2+tNxtsg!yYHJDj4RDry{31|0PjVGr>;Pp*Db<{Viuh#f; z?lIrzHFUbq(YE8b+s7-qeV)vAk2)w>Wo;+gE6oGuKROk#voyTw4V@a#? zGg2b(`YIGZ+( zJ9enI-@W^!Pu@4Q8@EH1(C%aL_FLVSTh-{!f!FtG<|Z+c6%p^(+G9y8*~g?FMTCzx&ARZ-?e>PY7X3O`s#8CRm^bgP(*sH#@&)fpjlk)Ld;WO)_fSn+TJ89{Sp;5RuL-or#~>!YG$A;b zyuNyi>llO_6AfA&FEJ(9ioCx4*VeYBmE7rO5(i7H4Ng21XJ^t#EeSaWOIoR#3s0wx zC9m(=xJ*m#DUv&n=85y){Z zt$)bttNFmU#>gOdx0%G@k}a%xm`NgZ8ufc@3wOzX_ZlnA`O z8=m>wC;PFa>DL4ooJqY@c!0gJSe8LF>X8zG*H?b_d4r~SV#8CZd&ukizEh?pt>kVx zsi)M%E~iqTBCl_vm1Pi>ZzPY5qUQ;zmwb{|>R`9&ssGd(Y=^fmwxkvBv%@YulW6te zis1BTlk6rlZVvJNj5VO#Df{M%W)VE89{Mpm|4@s-nZ_(F%YH)^!sIWr?6X;3xbH6q)h;}!pM)0J%OKQj`X^KG%8W9{xPpbD9 zy(1*8WNA&JUCr@Xf6#O19bKA+uI;9Cvj1p?Pu7B2^55%?&noeKLwlx&cy*+vKe%Gj zN)1`^Kvr8{1N)7-$suXA;KkGko>U*Hm}%%yq^RzMtX4A{*so7aGKfK=w8oXI89qtV ze$oG<>^#7usJ_2{1BBiMrS}#=0tv}(5;8-wND-tX2u7t_0w|z>pb5PxN)aiFpn&wA z24sfKf+Ah1A}S(Hqz8~1-tU>&yL;{?{-59L^F;PZ&S%f9r`$O+(`)6n%yuDqM4=WY zmy({E&SzBO;*k1g@oyUG+mkjJhBqImJa27W#h9aQ(uwV%*cb0x+h|B9f zcWWG{an?8b8PohYOrP@jpuweh&sCz~!1`v7m5uavQ#U9?3Fx3J)$g3#qKummnQzxO zLvf{g(wGefm*OMJ^$GD~vts5jjBaV?1%r?1g4r=1x>B8UZ(G3VZVi3f98ss49`8J$ z5Y^k;^AYoMY8n+b4T#DCRs>HjigxMNbsvoC3Qi!EvygE*&#c>*M zifwY$=-I!S9x<3nmy73rSs{hzt z#N<-Eicuw+P0wfU$Cc`X5kesx-dt^cwTw7Uqn=^q4MWG3>c!s|F}W14##D)tSAQ~I z#g*zxE1yz`R(tJ!9C(xwP?;Is^Qv(gSE|=zthkiSyy z_zSj<-d}ACs4%@&CDmw!E7g7WR57^}_Xb>_5MjSAG#24X^@w$~6++Lpb$oVUo8n7Q zJGlQ-V=Jyyj~YeV`@iXA+Jn1h3!bv=B2=zSbt9s4FicRFz@hXvXYowNnE7jvipHT>I=Q)jg;$ntr1?fulyz`1}=RH@6%|DLQUiz`8 zUTV;Fh2Z{*)2ItK#%ZtNO7+AZ*A=hEM^q(xJ)9dm0#~ZnmD^x+s21a)E7dt8mMLqA zuQ4HNl-Uvc1+G*#Kkre9_v*%Y=t}jYM=Fgvnd?hqx8X|l#&w$wF2(PNP}lB+@AGS& zaHYCR;tqx2zMa!TRQ&cSZR4SVdeFhcN(8`HhDyvE9->{2=%WveI;Rlat8rS0d+&y5 zgK(vKr{kQ#rMOR2i3>%#nN@3*Ot1ScPK>Pkqcm51a8BI5*EYIupLDu@Dp)3d?n`t} zQxxu3D;EJZtMD!!$jgpQ(hLke7 zRLCmye0Y?rbZj8e7DV*|Po-8u&$BLV^t~04_k2^-Cim)ir|bN8^v=orAikU0Co(yJ zARQ$>b}}9Ih@g@K#O@(EsT%+PNLG$rCbZFsQ+!alSYi8A_yuG!*mwr!A zsi5EEK4B0&+8#^Ifeudm@X2QDsmb(SOI1f15Cdk9PaW*-2R%QL-UrD?l#iPbaUhC} z3XQBAK+yPf&y2Fhhtop53!=%`D%N~(sh1a_egaR3rT0~-#O}h~%yA9-JAWQl%FHRg z*B4x1+{8Dq-osa~b_Qss{ z&x;qL7Kla#^Epoj5OSx|lk25!qJ?8e!;UID?345Z@0QZ#K3H@8eWka26zo;9L3f}ZY0+= z%!ak+q~Ct4l+L9lmtEi{pFvMUREhg&)t-6b)@oxIx?art5g!SQ4pWle_ z$fppi#B{XkjrfL+a9^wJ?>&7v#zWqj_8_NG<5jGizPR3I$9q^;^j#E}koDm$RQquc z#Hqoz9M1$0^u6-=#GJ-mLTFXgy{NRi=sB07R#99+tx^dmbkurpV`?~vy(eQl6o1ez zQbu7vMi(BARweFBE!<5XwsWBK?cpl%_t_ZVQ=vJHCmTV>xzX2Cuc9AZijS2_v;(ng zSy9K+XcZCCCi1rPKH*%nNH@KD%Cz+7v35B@eWIAb-zT}F>Ose#iIXAbGwJO)hB)O`NZ^lic9RC7e%YK6>E|DzIUuBE}_5h5#=-@eGvP;S`irq zf=f{gDJ~(~r4nD2=%zm^a@e`*ZI$3N$Z2H4*ykZ-3OcVL(wBRXvJ|P0vKP5;>^Hw} zL#v)Ex7jfq5g8}sPNlqt(>NCeL1Q%m(NbcFmtYO@9RuvfNP=xAV5k z-DPJi(a`ZhrA?8c(7_40Q~f&ZJQ3HtK$O~7C}JQ8F2(17>%$pj$1|`9J%V}Jx22mngq&|;UaVhGP%-d9=87y4Qs&mqRcuOVt=yIC& zD=KpFew+>T*6D`-xUa8_aV;MFYB;r>yHjmx`?QA={3Ot*CWZv^R!{dKOdRYd33!KG+?qzlmMex6BAMRYTNrO3Chd}tR(tKtIdRfUkUrew{`S1c z8z5G~b8>?BiPO|7k-P!kpypkhko}O}fW|5}VR5jgau?AXBWMrGH%7?)XunCqmbTvu zzzMk@18H0S3i^=>uO{10D_lkZG*;4|)9-EKS{{TP1tK`@ZIks+vd^E>ck%C)@q=H7 z&8Y-$A*byx_Y%IighrG`m*NEZS&q6bn-@VkAD(&gr~$NGa(J{&#{}LU95SlFqGzOVQqbl2rHqgP^gJIwYN22bYrG zl3Mk@5z_AxA!(nEWcoyZ;ZpYZ7Pb13iy$BuK`o?N^S7#~?K!PXSQ1>y9#LC|)JJl@ zIk$9hLaq$bA!&uMRtcBl>xvV&9{_u>B)tg}-$iT5T8YBpk+Ep6dlA0h<35%}GgE1w z@4!A+2+%%#jHXuM**MyPjgluO;R*u66ISNE@TDFM(O-Ai`INm;FuWD)TF6zw~y<9{P)Hl+?p=hnfcWK2b^ z`ril{oe?2vpN?euM1SE@^t}`t=1CBci=Y--UewzvUu2ofUP&n$AE`s?qi^=jxut`D zFO75{tq|5K;Zl5ENqt1%d10_VTVZ|VK9Jwb*O>e!n~+fkC*)4G;u7>+(l%lLKiQP_ zL%v^2zBvsiwAQ=ClxPW%N=QqTnq*j|F%pDzCSaXY!3|Zc}wWn+Q7}wi% z;}H9{v3@`4Qdj8M1cG!F13`b;T_Ms%f2nx5HKgo!LD)p7^?SV43Pk-qtD5x-AP${q z?djY&($(VgjtY$@M}oMpZcej`Ah^{1t1T@Z*1I5>J|VV)I1}nlxj$Q&J!ZA`oF5p8 z*sygRC-^tvnam(Q|D?R*AarnodcJ;3q}6jyqb3zZ&!zJto&ljqHI27gb@fTd7Ao;~ zLW23*?m~|Kb8Q_}7Q|Ss;v>pO8c#5Tj?g1tr(E{-LlV^X4L`+LW5sFQ&k2HNzQ1>@ zxK#6tG1eTY#9k22pmNSXpo8W-ymhn-KOs+NwDK(b!0B4Itw~(a)>fX z5)k$0h`RVu2%^Vjhq>^h&_X1>mSBdA7?8eqmQ6^haqd>0=qRUa%QsEqxIR2v1UlSr zedTzFR(06i3L_fjdh{eTj<-;4)j|;8A6b;v6s_U}N!^H#vf9pRA-)4aV^tYMpj4fp zSQmamRH6$AJRLTDeE>miPnZ;CjTI4+w#SNeGyoAOMK+3dmrAt7SUD>WbrwL+IYDFf z{r6GUSP>yz=^J;EQ8v`8?2U>a77L0ZkJ0E6^m6YN%strNp>r*OyYXDK{bSuy7 zmeH(sB`5}=3#0cn!-Tp(`aOilDueE1sWM*LgP7*AgXu@N0x>TF2#3|I#y{Qo*nmg zN7f5Le&d z;Ft}9OL5CUI{d`1DPzor+b^d6z9w4xGTHV^vrl~lzZB=)6Yb+~&TZ`>Tbc7@B<$4@ z5Z7MX6#41eXf3IP%d+RoQme-wt?9Bn1Mcg>sVdPlR_&2<{tV*roqCbqfuQdq|3Tk% zei>P!P#3-bgLIQ;AlZEF2%hi z*C#|l=yy>Ya?>vG@f~eo{P!fu8;ruJ!vL8EI z$?vsyDqmx`djQ1#N-sx7Vb^lv{>6C9!aaAUma_6ujSFJh?Msevo1!%?m3kHZNOrge z_YWjCfuJ4L$Gfg*4*aXno&lX(dX+UitQQ6+W}D)X?#9nfZ?9 zDRQ;jQhd%;Vn2vUg{!1TVm`V!UDoQ`P^pSC&+R+8EZy&xuY?)A31ZH@hmI=P=bRv$ zNS4!Y6XkrI1o7ml{ApD&x?GB{F}@3gsDibd*5G8?Tj+V;+wqpS9C}o)K6?iFNaG2Z z&{2DDR^(Rb-~_E*^1J@ED=qaeAW9x+6j>ewm*RHbZj~g0(5lU@1!?K9SJZRLIs9W~ zOL5PDJ1L=~-JeSxgV(DBjVRe&8c|ip?;uLYpWC_!JBmwjTcQ#*(W=HTuXSWESBc;^ zU6y^MlWk7p8FbLG_}GHfmY8!c#ch;IoCfhl^`z9ZXcg@biWB`i%ARN11r!0&UJ>Fd zi08LQI|gBuaDw(7#iD-OE?3D75XWAA!&+BdirWu$mHY{!_r<2^ucB3#I<~f~%*t=3 z#QkyCWyS3qixrPw(51DdZ+YV>@U`SQdrX)RIVFH-+o82ZEWV`DxThM#zAv6jp9+FY zz4fJmiQ}|Q{93=MlL#(F-%Gg@^+P3&LC46p z4V*)rp^TK=t?P?1IpEC4tSr0pw<4#+8d6~K#=Do-$$O4 zM`zBB(yo;CdK|~_ubs~a5VUs5K9YasG^&cB*>ENWdMeJQLDm*P8BZPif_%kmYC9EMi$2$I$kSy5U`YV=C0 z{nbO|BTS4gCyrcmS$@}*VXs6<+v}>`-^q?yAh;B*U0Nk_?fMCdEN{1oOaC6WqY66C8Wc zDlWzChq}+nmY^SLvL9pT%iD8Fl)db-`gEjviGW>8`=ji? zU#86m!KGe02kV30&RP^mWP<4N;a6#6Fz2?E!;<22v+6gOZh zT%Qm-(erYRpQM(;e2^67gF=*5JTlK25Iw=4XEcv<#3AEw&$#oxh{hG!3o}5PTT!>X?`ci+aS0UwUEx4s2?gp{piyEXGiq_ zf{!kzEz6+qa5i%M1mcCXes0PjX}y*gHQaQbNLlKlNB!M)oWlsZ-7*?biNdL4^qpTGNh=0ld+_XFx4omP#TOM*p~H^CZ+?*ImeIMjcJ)DZwnvtR z4o*~WFw{+Zg>qa@noi41m*kCo6QAGrn_7-W;uQsS2Cw zS))MbOe%r%EB!>5qG?}XT~W_verC7bjuWVVGSf#rHHhuEo^#%XH{b+~D9s1uJDe8c zd-Q|y+Dh}IwGNwWSUsn_miLxE%d-=_nG`z8EoqtB7dDX-H)3mHtn3pVPU8)$Af~m7 zNi6|_OYw12iD@8y{$X+24vZD8A8B`KUD3**C^Ncu4{L7ddVXtFrM_E0efH{9Ve3+YdEuC`k@ljXFD70!@zX|EFIKSdV`xl3~$*R%W z38(SoFAyoeRZES;405S|yAMO#?eh|qK+K>Yda6R?Vzi0~dBVb_IE{Coq32hc4|H~< z43ZJlLV0q-X?ijR9thQSV)`$V?`N6^VzRk zJ*ONe>G-p5nJ3_V!XO%N9FU$5J?F%z$_*`ovKLNUF}2=3wniioTx!;|*S%v^EM6sO zbZ1pxm|8f1s8y$-mzWaAX?s2r-mQ^Z2n3g+@1>EZeyGGD=$Kz?TKXjr%}%^-^^juR z=SqcGwuIuus%u}jMucp>6_@Cz=YAG(24lquzPCAzdyz4NNz*E(Wg}+bQg7X@Z&^4x zX;ulG`{DfJ03gPFu+CY?z&YIhcirTj=?uW0XWQ<+pZu2tB#xfI{qD$yFF z+i3Yv=kMP{YZuD)vA&n`D84HBF0f7@^|T%>9RI>capKmieXKrF#=>db)rk2x`Br9H zd1Ull%GlP&>Mi9_Dp4G*YF|FiaR}bI_PIfpSEI89?lZVAfggm9GdX{yuEmbx#IB)l z!j@1K!7~bN@AJrcg|=p3bh#8?;ar~(yP>1#x{n-3po0?w9=>I@kj@i1ZCzc`YfiPJ zB`(DyB$cR*o$9con1S1QAqJyWzy7)}y&+DWIYHJyo(OUpehWJ4 zzOuu4``c)ZOYN=mF6P5N%TNhi1<)IuYv=q1b58xBJ?QVP-6|fV*pX$G+I7?0Vyrk} zkDGmpqv}AGs(-j7g7%6$bKtZP z7onr#>W|Y;p;cUp_8r+0>93?d)X9Jt`2Ck@lVC+>*6r)241zLxzKi(ovLnmi@+Ug3 zVg@-eWpQ824^qy_Y1{hf7iXqCKtH$?-xDf^LX9;^>1?A2~x zE8?^epQ9gf?G~lC`7&DLQry3)1X-W8jeksAgVjzt0 zZKrwm=Q#2_aR-RL%WI|6*%FuH83fm7ulD($4|Fbt4jzAS51__AxDuyV4bMvJi}~P0 zy{RGANK=-|Y1?5!J^9;b&aiLY+aMHnd zC(m&?ZTs5G|Bg-@0fI|WOhwriMPw?06MDVK+55Q&TE{dWv_Cj)ohRyF6+GwI?%f|! zitlZez?qC*dD*vV+X4vMkMc~8)Ak-rczo3H3kWX7EsjdyEQ2Bdr;Gr|;>b8bMlU=@ zv31;fEx%>qC}xlZMI2=9WQ-zdUnG+zBN-`W&$)dHOmprhC<-r8dz$latSee^6jM>O z&D+kc9jZS;eEQkI^u<`aoZ#QfX}p^QMAc~1L2H*w(W<1;rM0UPlob^@xhicUMwb)3 zADqUuyVnw|ShOx`aq3N|Wo4;U_sCZzeU@=4GM0n{z1sMaj&Z0R#+|+(`YhR+a|?+}SS69x=MoHP zrxKg%70Q}ECM=iK$ub49x}`SFqg9-kx1vavcs)E9t?J-Xytn_|j|&y=yFXgeB-i(v z>uQIPek@d>ccH943M zC$%5e_j;vxZ@E5|c=hxTZaGt2YVBsXTh6RSB->oF$%!Cw$o-#VEOiK%{$!xxvqQ!m*TzU`cxgHJ+D1Mx?{d|s;eD(l1)w& z6{)^m``gSoB6jBP zlS)|M>y_fY<@$U?GU*`uA!mw9k*$<7>m%?XfPf|XKgY@<$X-b)-dnEErz4qkkgb)g znoDud;3F&@oUp9+|Fy0xf=ltjx+N5$%x{c&jP^)-#c7q`QoOhSO*F6V@JK(% zrB0TQ^yKXaIe{lddZcaVwAv~z#e4hTM8nJBKJ8rU`_o~*)>=A}ZB5B$F2d{KIIXtI z`iobJ_x8Vu84sKIW{OL7k8I+bS+!LPai-~ikCm?=QV)*(2J;^2~#LmY5y$5}*;!?b~|J^ET zyR?>EisngLSG84~utvdauQ;s|T#ENL7vbv%&9n3@T#DAT^hBx-g}{oDR-4l*LF-CN z@!tM7L3=`K=Tfx)Wovyp@BtntknnmqPOF6V7q1lWZJtCj=^*fi)f zA~_12RtYY}dz&X=wTf)5T-98Pdj?epCoHS|f2}K^$tIWLz2*9ZSoc{uvto(E+O)OJ z%r&h-eRt&XUCVbf?#BT!qSRq++ZvT>>zG097Z`)qsYK+;#-99#oG$z*G^%$RhnmmtiZK#Fa4BxP zxIUb;g@&39vtkUI4^G7OYV0Yq7P<3UM+m2d_!^SoSH@<(jeogRptY0M74L$8S4pzk*3|E29URa>LTMTE&T+jbWa>Cz`wP6T)fSuZETW2z}WHf=h8buM!4`>ewT+ z5*1=eQ_n{|o4fE6!fD)1UgEGp_JoKaCZ+ff=2!6S&yt6YgCME~5VV6c*2K8*W9@Tk z!SVhmScabXX#j#talgy;;a*5c)6e<@n{!*EPLhm2BXoUbo6B+2rk8~0oNzQ z^PiS8pMV&O8RW$7p`pGfFK`-9o1Rt9JYMXuF$+4l6t_ew@zLe6u_YiaprcHqNYBo? zu`c|CSoYlO6S+qfqV~D5v0s2l!cQ)uMXXD-P-(n_2UdYvG#WqF_j;xH>f`!^c<=1k z%*U|nmC!0q+&B{MYayrcz6q@MDc;r2rT98liDcOIER61lXjSviqJ1OEy&Cs+sDT9W zEk?IATE&U&4WoT?&S|_?Mics%vBC@o!KHXKpb~vRd=Af+g5Gl?^Q9=?+U2wmBViTh zW8T+*;8Hw(P>B;D?qF^Gjh=HN=yj)W4{{n;u-Yxqj$xmlpc!ORJT6g*&LE!0KL03y z$luZ7vn2{G-txp~bzrS&pK~d``c&ed-7(sq&xM*_V01aLWox9*+Ho3hYI4VDx3Nlo zg$^#o*Re{#^5`;>>5&obi)46?OEV~QY9ZEwsDKfk3LTtCI*HubYuh=EH!r?cM@P({ zQOv-lc*xb{RYOXQ2?=X zd5q83avFEOtZk-`hCe6o%%uWPDg53U{!iZle@-!jLhQ6pKPYD4v=Fc(I@uG;mM|$E zy zW05B;vj=WEmulB%=6XjV$S15L}9ElIWhjIX*m_;8_OVR)G0#htZ{&ffK(xYU-OCPUBr$AliT!34%*e6eed)CH?|& z6m$N40721NWP>Iy{8&++q=k5h+~WxB$qo=)iu|iQt>gMopNQRb7JK9*d=w|hQ^%bO zb>Sz3(|Ct8B7is7;q9j&xRf0Y*jJZSf^rYCCuB=<5j#<(w=>j^YP_dyxKe#)Z0rIM z<3ZT*hb=`OK=y;{!=01Y#>OJb*XN;CoFM-p`@w0v&kMOn;U=N_P!L>-?;@3GoE4)r z$5>55t2jX(PR<9XQH_gTt7Fb7lHpQ(2dhMR#G>c1cFFp5irD76PR_3`@vBZkI6(Y? z{Jcs4p?_nz<^JF_Dj+mr{(&9!06phY{HmNv%mX@6b;`gCdm78Z+@9LxcoL?*A*N}u52O=9p9rTP#DH8z!afGB1Kvabo~2PX>ryxA>%6sLut6uMkQT2AAM4v?(&_t@B)_?JuZt9>eQ3au)AVr=Y-XcZ?&pUlrW zjeZ~+n}jGM%-atsMdKqgY?XKmqx&&-RVi;jBthdQGjC4gxoVife%K@RL2xO)!d2oB zh#2JO2hkr+So80V;W#Zs%$#y&QlZ0IQRv`Oe0QltO{|cK=)Ds?f2Y?eU+oaTy2!7} z;n{OP#2CMTm;)W0xH;vRTjuAS7UET`+j#VaECZL~*CSP;5l*6pf(Qv9iirbmUw+Q6 zc?z)=+4e422LXah@#~yiA5K5u2N407DFFoSV40tD8c)!HWjKdC>M{r}#jg*mL_CPI zAc8QuoFKa*^K(w)ZVqHbub?lagG+I1pc2i{hn65d4Nj@k;U4rxKO_8k<=T()rLTPE7pzcV7!RjdwNfj4>`??cM>!rT98li6^k@y)e4l zK-_9kG)vaK@vE==sw|$li`eQhJi?Ix;?nxUS#r)fEktWg=y$M6Zh+uY{5rQvyaK|d z3-dN+kQ29h1!u{%%W2eXmprV|Y1BU;xD>z6trCBM*a{*ifXJ5|lqL5dr*U!z>oyC! zwl4a?rIhRE?7BMc{{T@J1kE`os*QT!vn8Cy{c4CyLScKSfZ$Sm^{E8TsI}3U^Xgb7 zocMJ49iO%1G|u6mBMZbe=-^U(9jins%=uJAGPG-7KVLLUR{Zf=ESf=oe%@- zT#8q9sKlorrsP4;xXBof(?X2F47Pyx?ChNnDa9?0N^Awu2Hx|WcRnOx&A&H4=d=)? z%qpjkgEx32*Oga_TRWAQjWtCri$$xJ6&G2u_LQuF%&=(>`g66?h+^IcLH?W*wC831 z$!R>V57s9WyNaw2mm(V_^K+G$g#Gsg2)d5L39@!FZs#7~o>z&(n2Q9=NpZA_A{jY8Je%NI22PzZ-*R+0 z@xz5fzPeyeMNycXHI=vnq84V5EHx)6o|E|?r}2DhWD-x1pML^^OObz- zd96xZ$KH4rS?U~&E+@!S%ed((}5#Icq(`tTh z#~*fnP98w^LnV@spVO(qVzi1Ar8oV{Y#*2WCd{@_x4KdMB&LP6S}w|eWB|9-4J{wLg1;P+kD+V88v6E;rNjGa6sK|i=3*Rn)2ysg0g3n%3B^mCpx#eEYE5^BaC1#vqM zV#B(;=&ngOVj~*9q7RDB(dc`n6mN;Dua!AcTVJ(@9z5WlHtb}$XGB+rD{E2HxF7xw z_hff>xc)rTG>(3MX@%^^fdN8$@!#Hh@b$+U|6We;5fNhgg4Wu{@4T#6uklbJs-F$_ zlv-_nFQ^i%fv4|kT#C0uC4R{9XqkuG>$Q`wSpAUg?RGTWGpdWjH7wcg zhwLBTAbHcHH9OK?KR;e2&g~BO6kcq%iqp7idEKMU0MUKI6^%>L=K>uauJ3C!jZ=xz z$Aa~DbDHasF{c!w$*=1Q4fG1>SqkxBUAX7V=N+!fRhq@z&5% z`WD9ujZ4wzMNWrn_m;+SDlwx~FI}v^sJ)*xNg+ne!kmXWT%{jB7sqKKI=Oo3(P}Td^8+2U^#`uS zRvaJhd05fmD&DVQT+7Mfp8RcW9dpNpd$w0_xDr}4ge`Gg8>PSfZwKx9N4bf7b!e3| zQfOSMo{*@=Y+R*ny5Z93d!-a_A=ihzc5tG;tmtZOLD!ZF@nA~0r(ZpXYyY-Jahw)n zz~n@I_&2Mx*fTCIP)hb(CCZ^6WA1m*TIF1er5?WDG+Rt=0y(!b9)BR1c}8VW)0 z&5-YsQO9Zsh>K6A$4*PG5zD3MvwY8sO1yBZMl2Oy^*@k=`-|*%qL2+ITiak&wB-%x z_w?Qr+qQcN(Jv1|`VW=f)g%ahLnQaO{h`inIN92B&>_8#U*EUgg0%Kor&7YQRe~&M ziPh1TZRa%3MWMqr-`$LKa2w7Et{YWI(1BKoX3!BxNdLiUAttUIY4zi+funS8!^yUP zyf)hBePj!Lgvg7K_MFr3oE3IiI!=F(sMBAh6j|q~>!N+$KPv4^9hl`)`k> zW9Y<0JT1-dWyqdC+8FKg22!7o5JU1Hr2pVFo)`XeFx{_~TpAXF`w6n=L0h7I{zK~X z5h5=_dK^x}QhRJ2hoA4Ib3Z{IpjaC2koNiysZWUgHX#n>K}e6oX(7H1t!MS)L`J;M zJqvk&{@bE`9!Ki)5#o3rg!ECI#=F(J*gA@T8LxBCLOx@T5$*FhQlF0y#quDekK#10 z34arB^<&Tr^>prw$Y+f9MEiV{)Q2l^HX#P)K}fI0Y1A65wsl;A&*i>|yiETeqJ2I} z>hlpIFG6}XPUE?7FTkr|UG3WutaI;0Ugq(EXrEV;`f##s6Jl>3g!F@)7UF$}tt0H$ zV4Zs}vgfUTLO;A-P3l9Pj7^BV2<{CeEkwqYM5`agPI)ZPDW%AleDzDT&*S7GL|%mS zQJfZH*brMszHYk|A4Oi~$*;6O8pY*Fh@dRWPOeF@`gs6}QA$={Ug;;jGncnGK6@BxGt;TWe?Px@kYa36sVnZ2=Zi8Lf z^E{rid!3#zPC9lY0{C-6jZD%mV+QHZ<@@erG$2Ivf=PPtKMP}b6bw@cH|TW4RM%g# z-@->NBwC33Qxo;1t*f*jhq??Nv2>jo?pcf&F1g9HfcPpq{~LO3*LE%aa8Dy0>vb3+ zq+Lr@DNYNq=;e`mE3-eY3FlXc*;t8pYCBxcT`G;|W!xC0AA8tAd&zk%lS}bYP@|D%2amOvs?Je} z`mmzaksAmxEg;_Yk4tUk5XDTDqZrDQZPcg7T7K1lk6cn(?W@5oZ8 zxm1E;6q!478ug+-1?veSRv#35%HUEms`+y06knD~`h@uLmPfnvb9?>M@mCZ=##+1d zDZbp9XjI)Jqi>4*{7L}9PYpPY+VguJ?c7i8^^xPQ7+gxmj8(&?_%eFZC&Z1+k=jn2 zmsA{ZPa$L^JG0aj>%4>_PNMy18M~jps}THLgVTt8BA(UG&hDlE{KX@KOVMe|vp8E? zSbU1_e1`O)eitW2dvH=z`M?u{@(g*lBy$mZ^CHFV@;nGnZ(Y<{`*+yOddFuT8vGQ8 z>)^UkNshCnV4N+LjLA_5{=J;WRe-tIV?!IiqF;>7F}Re>AnN6xVx5u6J|TDBTr>7t z^keV-CkheR56X~;hTU}pY1OXvHXGlz&*AoTwVyRfIy!f;KdU*8cdSf|72JDt+X&AnneT-e$Gz$JRNVl;SN>i4MU*+W70e&AoT* ze#nfDRz~G+{(i{*A@dp}w7uEA&AYHb{CkOzxf7>_$XPK`yIQS>=^l7b<5INRE4*y$ zPzmqpph>5LfrQMRI4wl|^B%3ovG(ThN%pCll%joCy0@)ECC1?7?&#t6=2PC2J5I>l ziPM;m+a7K4&+W}RIJu+0NGY-<_xjj6RH7En$nqD7H9x=^8QGU=US4IC z2)9pI9;ey;;PIy#S-M9g>J6@}GR8;bCZf0GriJ(bk<8WwtBm%??K2rE#p8Ca4^PgY zl&Jsw-72H)#oWYa-`F}hEyR?Dz4X!#E*e*^*(Y97if0fiu?nYZ%~LNLPrlDh+*@Sp z;56O_)v=d8Ztg{6(w0dY{Y6TV50`n3N-S*MOFz5%qH$+uZsNz8whm4U(R*dQKId^M z)7jEKPn1$Tqf?1X8{_qRw@aB1qH+_rCfhnVjaU@tqW21vHb>xGl>Q>6cxI{+r{=}$ zZAz6kf9jc=sQ;m@gVU&hz-evg84b+Y-qTts#WQS`nAx+QetTjA^V~f9e3uh@M%X$y zjrR}Y)Y-kXfms))&h!^4#rK^`tO>8DyOuOCUrEhPJUztL!D%7BF@p8pMPtotZS1pf zDaH4^N=!%Q^-y#)%tF_#jAh0_`+NB=QnRAp?~l@pckW=k5oVu2N`j<{?9WXL@d9-0 zFVN9&6uWMn)^aJigSkHJD4g$>JJ`WkvESAq^D~O0xjva23Xy;uXJzn=%+*uuQ%*_n z+= zVU;*>Iz(9<%^IC8QT#bCHQduKHQLoAgNW_O)u>euhi}g086D3*WdH13Z7_(4=(!Oc zKHHqhr6_xOaz5J1aa3X@avajp?&B>=j>8H5O+u_}HPRxEO`2%%tSB(2lKSw}(-%hS zS9{M-Jw0%ul6g^XI1^_XlpAt=xPsN&*73@f2}(Z539e6wmymx@KYkc>QXzQ$!D-9~ zhSC zP9tV45TSSP_jknB;0TjT@pY^cdmcBlbW|^%n~>)hoJJMW?5Y+qCabNrKcp1jA1V<# ztBC&Ayy6*2=X;o3itk5tN6j~b_2}hCGWxXXr4VFA=?t0jGfv|g{jOlW8HkUb?`3i+ zp53WLrJ}pEd*zm8?D{a#VIV@15=}0}vpbcjyWF}qA(jjrrC2ylaBGLVAXX-5^NyC>7IJO0LY(|m|Hd@$cX3()h@Q8OBhFu4?O3D+mY-R0KRB{BCvk|{G5nbG+(A^WNm{T?U6?}o*G zGo^=fk6R_Ub*B8oPj}pOBX)hKxb!1YADLW=XLKs@#U~+Jk|PAI@H1tr}oy`j83d3({sHS1WNhHz9L1PUDKn@dWMi(4OY6|J*m| zFH(xnzezqMmbbMW@M8DG>ZQB0! zW`i~M>4zkE?!;+4x&E15TEVRLX1=el7+i|)RF&v-#iJenvAx;zJC)#h6sLu#g_t2| zLre4ZLVsE3J~Auf_CqE5;cV&I?B?e4Z`)@}lHgGvr}0jUX+`wx>(OS<3MUON#qFR< zEZiQfmnj%)hP`%5A;_Z2D3jB8ZtaQ6dXo#GW>~3x)~TA5;?`LuMl`IaU-_be+5CEz zLOfv6GN)F2ZRcR&4LAe^@8SnD%hC!KJuIR*9NNM)u~O2AAT|i%QgetC#-F9~X^L6DC?``Z7!9 z1pg*f?~F^-3ol<~6mH&9At+y#c{HbS|M`m}^}k9CFg~4Ez~E9m(o=~-3ljCHf~$?D z72^!b8e|5+3I0tuv;1e2zB+$LBjU~LnVjGm3#U;dj0m}R*M*tQuZLxFDIOK8M1yjp z^Ftk- z$CJmQnmc;42d;DG)QnBUdEyVOf{y;e3Gz5)d*HM_ncnjwYwjN8LD1=GZn`thMZ<9} z`WCCXBPrezRbTUMBem-|L+;ON?rsh&9#0;C@+jx1;_+nXsfNw&N2!;EwgNSGiLB<1 z{=y0JT~vigBZ87$AZqJ?OLs~NxHYQ`*9b4LW(cDfc4NaHyZ zxMI>8S4?KK^4Hu+g0fUcwc?6Cygi~xJ$>3Y4fLQ4e+3;8WNWFOp-`dXmOe?NnhMu( z+_;Xji`Co_A+G`j(l}M?P*3mkaRdFmul+T5lAwBqqL+&)`f!rEBwn9|n!AoK`YY&& zAX`h-2^IGgv-C+C^(Cme`vo<3Cs@rL5oERLN?ag~lZljg{k!LRFpugr$5>!R-&Kt!PeYndM*HZsD)IaxHGEGpI95lz;Pu6b8DTomi- zY1FDUMXg#()T)scrR(yNpgMraYQ+>9ql=n57i#V{u$nuP;{D+IgeW#NQ4bDYtqpq7 zUvozUc>t~g$PE?UD0K$v_fb7HFr`<_MGcOB_R6o0s8R@tGNs8t=cN81E4GJ zWmwG}5oFKlDtjP}Cn12ykD9xQN&cEUNzhgHCrL#EMz_|%FstTnvfE#CM>bqW_a)#B zWHw>j_B(pb*aj^Uo#CwJj{d@}vr5-a3)cFUnVf#=pud8Syo`+1$x^FCVPq4=B6EW46XF%8T|rkV4?=naP75*N;{>bn%)CC@S3yTDkA+s>#w;Z zf_no_?Sw=dmpd*5N15OLk@AWI%g_5PB zww3SatDqyRFQfZGF{(b;5}alH+y6+$SX8(1@8$l3(?YEOw21CbIFd2^LJwaB9eEiU z-M>*=)rY%fQ9*Y#rg=sgSUUc_@_dH;2dD9#hGUiWch{#lvn#dpRnU=?jP4zU1BqAa zq8_f`g^UGR{+c@?xX0l%;`Wjedj8P!8QQ~Uz6v_>OEOlk^kXqaAKt!~SWh3)WOsD= z$??8=IPx-_;QHX57sTs>+<#`oboW=#5y3qUr}2c19i8qzopX2p$W$r~cDO=B1-9}!96I`DVz2HB@#vd~FBN8A_COr%HIGh$@GqQ{@U6OuD#_Cl_M zZ9Auh=!$G2e#-oevfU>7YSqZL%UJyq{FO=!{5(-VST8(g{XCDa@{IfkC%8W3I9EpL z*ACRlxLnm=t40L(aGb_7Igm{xT&|VT;kC_*AC%EO*>;tfQ+%}ket3tNh7S^bwQA%! zxqsy}PK4n<=w!R{cz@*?d0~>0{zD}OfuOqZ)2u2?^*D7Ee`QyN4MSB}qeA|wFe2p1 z|GiL~u=Ul2_mNd$9#$1bggpOlF~3eg1aJ#gVf9cIwuM!Nojt5daaxF)s0w>$cYp1* zjsB`IBIL<`<+Cb{H-I6MIftsScUV;zNzv$1Z5*{w_2=2B3hU5ufOccKzbcFfnl-8l zd!~L}g~mMKib>gD7R7#2(O(rtQhcnqK0GM|Rbf3)74|l&!g!1;Ptsp{rj8P2;u;I8 z!d^jDn1@w`or_eZI1L@B3QPDTNBex$Y+qFv5%T1}MmLqtyDE&Nc!b1bUu4^;3VZJU zW6fQ~Ulm3K*$=BKELo+6$ig+2ZKw*H&#S^9#pjvp!xAfUg8bt+@{d-iBa?oKr1;$M3<)P*%d6^Ps8!3ZwO1j? z%g}X-AOBTp)F);)({G`cbHK^12AATq#`R%G!4}3KgS>_sFBw^!{kpc2LGp}Mh`q=l zFC&ATk_SOK;K4MN7GgOv$X3W8=!th*n&zYc>*B`I+dR@E|C8FBi}iLb+Rp`0?!%z`gGJ^6-52jSk11#;sn)P zy*RnHa!Mh@;xAik*HIPL+*=hUrTD1<*N3MRG<#ONj9RrLs8yrCNJ5?z{4k}qa^`^d z_0Dw#hmBEDp`v; z=TdydaD76IP7T(6I?&s!bLg>E=|m^=G*cAaC!&swKC4mqdLt}$7p`V3ar^7YWd0!u znpwKaVb6KL@55pZ5cBdN=$biYEL4|poM~{p9eu#uqd0L+(6QJe&UG*TBY~8nui+R)_B%H z(f#+mY#l0b;PL`(=CH2jtOmIWy4pwC1gDYXRNke1v9G-u^1&62XAKnHr{Y~8G@>ez zQDm2vaj?Bv`lBlv&jA7nsZWSeeXeK^SGF{lm;Xy4cy!NcoL}izv=bX!nsuuErEw|x zylQ~mDwQZPv4~z##F)#jo=^yi?&l@i1gB9`lvG6jE?oD_bAUjCYAGmt5#p^= zmG$&LL(PiM>{AFH-E$hXwZB!?hyM|3E-bfC<5Kkb9aQho=&D4yf)V;iPZjfM{uG7a zkvFH|KY}Cl?I0=_NYS_yeO`%5C(@x3Gq-fs7k0}rMjW555IpkcG_Jm)4j`jLj?wnW zY>i9NXAi2vNQX+yLv_Nc;oFT(!+RCpLnYos zCC9Fw1B`ud7ElNt<8m4&sUY+&1B}>#1vD;Yecos5P>CUksmFc0F!Sc8VX>UxF)pWt z7z-lm>xG$dGs1lJJ`{NqLFet(SRtN!;?;+h__bZ{^X(yjy${)4ZndRV%7(u}J#~*O zTH?1Qqsmn9*ZX|2%l5C*i^{!uZvzp@$ZKm&O>^F@`$O+*IzL6QD5 z@A>O}o+PP}rGFGC3Qq(PoiH<^9jo`DSY3`A#ic5-+gtDB8txW@~-zGf=8B| z&b!`+vJ|xWg!lrxmS*r%RPT_KjEZ>_&S{(ogE%_ri}0UWy${9I z(ymYpuM)MrIwDY0L{fCe2uX2*>&v^|hX@{vavD#d$seKrvmz)mv7o#!i2|PvHJgiKsb6^cOxXo)Lb|U++V4yYyGIAJrW- z5A{ADoj;P%m(}|a!Q)*{qYe&dWWzutv3eiMKje8C#ndX1SG^BON#A~Eac$qZpKTfP zs`nv+$8em+bI&s6uvw};?DO*rw85FBqFxR0*ZYtZZwYT9-VS`yuJ;+v>wUc0gpA>N&VXm# zHwce?_QwQgYhLdIf?H>K>P(phqCV976s;4j)ccSP=P|rWe2aRY3b(VP5?H+t5qx|& z4IO6|X!nPAH6x$BZSdamv7+D0m=U?!ov_&Dh>!=d3L)}KydTtax{sc+B|KLRQTPE6 zWAh+n6t2<(CIoA*Bc>j8__0BMky0|IrrA`950M)jM{e-cq1=RwqdAS}^>l)^0`)%Q zS-lVSgZEq|`s_{6K0y@z#ua~skR)W}&1syfAqua6DE!-ow+;G>l;R_*5<5%o(#{@e zZyp?b#hMQ}?%X5udBW2v5rxk}6yD>5+=Pt6IgMQHl`C3-)h*3kPyc1`NSIp#l_-Lk z`gg?C4XfoQWK7LzA%;&Vq7Ok#UGUlogZ?6=xK&e$8i>M6fcWZaZbC-koEBn)H>Upg z>3s(MMM`m7s}j2rQ-6q(#(qXP-~O^Ct~A)APh3l~UH2=W;`LZ%vMviU-+ zLWSv;T~*BJVEaBuDaE}E*M}#>!Vj8=ke@nYpLj`vyd{s2scM$I9UlITYTOQ8bBw=^ z&9>@yr4;wCT%Qni5Fr;qgnV?geOIF-C{ExJvQ;mP$N=|wAqqD~Y&YhNuR^5i)ATDYnC@Gl=+Q3p2~k3bSg@WgN|;Nv;oX0gtMg`P-BPvl;Hx3lcZn z(vtP-bi+-xinQnH_x@9Ze_GYZY>T_kDj&>E(0yfO&pC~}_U84>vyEOcZ#T~|=r2;r zx#Wg>9qx}K9V)S*^v%q~kXOw6j@-lv=%AA#PU9}2=537ji7%T2NzIAur@6 z=sq}#06C2smR9x5*0UR!4Oe6t^cN{r;coI$5$1{mRm@LzY*mQPKizVFkEeK0e9dXxE3+-$oQZp|n%!J(aH*lqv)xoj zNUc(dYn3C+PSc>{y%b|`>1?;OeVpLm1WUcNvsvPs93vxTwnFrc%65N@XL3+3!f8}l zwC`p9WnMH^<8E>;_4a4kZmJ`sR;fgX9i2_BNRIJ)y*b9o_p{y7T5^JalMrXizF`(_ zyWP08y@x^!{v_Mo7f;xryp7Xn)hCJOs&7{rr+d2$F7@YuY&X>rQma&AdC(i?d+oLx z1Agskw8_eLOZ&MHEnoWY&CfjgOlW5Q zTiNc`c;W?}0dOf!Bl9YdWDe`ODD&0HVG2<~+;-EmEa=RE(?S%ANHX6YGb8gvshXKw ziatxvpb{ygYh<>7ZQp@Ai={W9Gi2@oqy?wC6Fh;&Su^u{_>YMoxDDr0oW?nv-y0|d zx6Yi#Q_{-Z%p3%7aNCiiaVcr%H=&+IB^vKfMX0}1J`(DU=tjsE?*o9_?2s}S7QavD`H|4cV__3du18E{wQ zQuLWT168M}M4g)+qY-R-K|JA)6Wnrg8ms+|#~6rvk@KTIkxS8Mvh!4Hq7o6X)Rka& zkF`Ce5ZrQd8c)9f@jLEnoCbnRNgGU69V#&omf8hN9l0V)A-EmnH0l}jdS*Oo&qu7y z(zq0Trl%QEjfP76up!{T>^Yo63#;5xxX*-@&dLIheLN#kkkAo_kdBeQ(jnz3BUZ@Y?G7S2!L zL>N~q@q`MT2vZy-uf*|~s{PA1+a3auONqvZ^Ta7e-Yx`qF(&m!yeKdHnF6r;$KTa{S<)Ekx#N7a)`T*3*i z4^O#S-`OG>|5n!Iu@8@TIE`mntm|xsE!wj6&ELzKT#Dj3dDg2EscUT=&CirIdDO=V z{!Kz;7l^Q0MgMYw$A+91qD#pLQ(w>^a?ZnMCYR#tSS1!dW9bm>ZsjIqw9IMT`7*z% z)vCfqTWfzvDZW2cBKFH7=8jc`qK5z8!{kzYKdL(_G9%bbFpfmMfGCy|JhR}m5b;}r z&6h#k?AXiXQhcAQMByBdQT@j9sFulzCYNgS>P`1oxSx|wgjLH>1>X6K>=jYB#;XL+ zoj8q})RP`#JcxW#6HP89Ju>BnD)H3Lk(PzK*?*K`;W)vqoe-zDBpCB+mWrkmVQv%4 z6}jpDq#K?*jI&-&3-RWa1xAAcB{RC>4p1(|TcQ$Yx7NrcyE`2x!W7-f`Vtw1(HVe@ zAMJBdJzsd{x<3=r`{G2H6Wls;8YdG!-^h&L9qsIiJ3zUVjQZ#dKqbmm4Kbqb-pF`* z>{x~1=U6>(}H?^mJkrIT%naV25LiJw-gY4yA>vFeSCzcP3waQ95<)sSji*K&xnb$(67`WTdl=XfmH2$Ky-M~D7^Txp$r@@o|5R}y zXVAX$rT=Tx{)xi{@8dn4Sp#-(Vl&^^^uTh0528etF*D`ancE`X3bnBrYdBUbS02nE5V z=(D^BM4WMCFp%Zg~d}r;%-^#G7NxcO%P3s05FSIW5GlUAB&6 zwd(0yiayIqX_Yt>)yrzt>nDO0;{6fXZdobKX*_`jar=c221YjDs}ekp<}_+?y4X6t z-4LvEDf%pHt5ssty;0_YZeKg9zc@r|c|F@L@5kYBG{x8cJ9tX`J<96GznxL*96-oB zcsPwWtRkDB`MC89?u|n}Af+E*Dk->Qz0nEJ=fmW!D&3#01@)w{@b-}ee5$bDaE5= zmG}yg{_$x8v>KD`Gcrj~bRX2r*1>7KkqyLx$pf_d6AM_`gp}g>fJ(GQj#FmC!r0%x z46`y8Nzi=Ad$2f-=M;e$xPD=5X%Jk>KZA7x@{c`-!ZLS!n4pix)mQSuvc8qa57Il^ zammK{VVUPZe4Ym}*L#00r*WU~gkS^LYjwI_OMj74(v#731C_w_S_9W>b-G>~NSt3| zk1nUJ>$L{1*Xne=mi{88cyy)`hdxR$I*jP4H@K0TsJzP7!D%6mUszx?8QxVt-Qc!C zf00r=>Qjl;`4$@OhIZ8t*2zsoFZZqz7A@mljrn#NrEy1Y*Q6^3eXo?_aWvP5%9^Vl z;|3~aN8oBkAkl7#t%K9JE2YB~W6Zjix>o5ggZ?6=cyzB4#wS;d3yWLoql)GxURr4D z;It4M78WrFW=HGy{y1UKU!)YzQdA=3lOpDw2hn=erQF1ub8H=)#xps7tZZ()5~^3I zv(KQvNGWb{RATMU%I1+38K#j26ITY9Ob67+jNs|1f&IgP7JX~9PD;okbIKRmWhgk|K- zSH4PQH3%~1U&9{6Q#N^&$_cIyHNwlDWS+(y>zkhBCgfd>oJLg#c2o#<)PWoKHM!R) zj^=wsC7NfAG>is4^qaBw6oN;roW@n;Cku?ox4Y`=n%%a}cV*npSH4PodctEgJlkH^ z`r9YMlHd_5r-j&r6X9K_+v`EEUeUM|-zzFnAlqZa{MKIoJb>UaE~k;>OuJ&tUDQ&4 zvC?1G8M2I{`Cd_pQ^@EGREpL6RIscY@x7uFVbF2C zY^?sV^OQpHsF>42JTWSp=Wc}Rt0MPV=hQOtrad9|ib}lqVm))uq6WHquzj*E2_6-5 z8Wj)~BFwGsD*F4zR*g#q?m?*!)d?@uGnXbb&1A*5u2@kJMJb{ph}b|ustW&e=Iq>kXS4Y6=XtK*`LgeC z-sIk7GBcUXK~>t8jIJf&fPEe!gy8Vd+mPEubYQ6rr zI<$b+7sa+Zwq%i}H*#wa_8Uy=5*lS^G}^mqTT8kXMXkPlJ^U3vtqje{^|a9nM*{t5 z#jLYK{NFk@2)%xvjL_?LJGT0frl(}wTB7#V;BV{%RAI}>BnI3w)F0ElZm4qQ3kHF$ zaHMHH0BVJ=A3QbTSXLR+*KOz27FpIBCb3AyGQtgM6i1IU@OsgDT!U9l=I#8R4sW-t ztYc(sX*G^5(JEp{@Eu3ZR8gyoWltg2q(kt%gguZpMp%4(pGdnWCQx85)hkBh>d2UY!zY%bI!T)W|)XOYSP(aZqgJ zj#YXjgxBvjiRX99xKEodLwtRgVHFbSN9!6;`-=NfTgUb=2z_VZRqK$Zcj7K5N8WF7 ztb$LoSW%@%LU^rnlYkKxHImA8JFAeulIXlj9bqvDUC;9he@I)_T{Ob7QASwQ_^w_D zP>-GPx|}8fBP;=eYi%ZwrWKT*l+lkvYip=cXRXpBA-_I8DGiZfRY8B>(Qwt}n`A6p zuZEbG&?Q;c0ve$|_jK-EHED!ix4d|LQ68<=nIw?5tWild{AbVS+STmw5^79etMo`n z{uPs4lbA&FOR8>~U-j8@71VPBovi=~^s}rFmo@VD*1K!hv|r`fgeLfTgw9rgG>!Mv zY3ZNNbl0vtG>ZpSy5Cct*FK=;n=l&}4 z97hxU>_+FbK$@OZ)BKVK#m?@0E-6_(E7B@GwlFh!vTG8h`RP)*3{~%>r%Ss3$}62B zfqwK|(cNI?O~<1v2(l&(*X_kA!?i**r|* zI`y_2R_Pu;j#mD{a=AX&Sul{M73JvpVCSw0J9F&apq?n|EFq{unpWVa`6V9_vHQ`@ z2BGVAUaJ;qnO~yDWO6N0{d0bv$toszMoN&lL32OymTv7Q&`dzC6L~hpjhpRM?W|Wu z#Jj{T<|n4y4K%@b1HE=5tw>tBa8eVR!%_j~C#Jc7aNVwHs^Mt1p-uBk_EbroZK&@C zx;{6F(KOqzF3lF{1+xvg*5}%pXB+Y{;qh74yd%#<`uAz!|CTp(exfFLMhf3QkfwJU z&P<84ruiiuyIzi9tUK!COhMk)d=|uBO9_ey9f;DnlLi^F&+P{(`YiPDeYkDsg z39LDhrl-jC%&Q{JNco8fRB^1=IW&odG+X2h%@&zSGXasnx)y0_`w;OE%}9Bl2vl*b zS1mM&hpDE{NwY<^uT7l^$n`nagGkfLEi@yg63s}NNplBL#j#$4&?H{nRKvGvrSzHc zD+~f_HKZ-;P|A#yG1XQ?P{pxcQP3pH(WvvkG+U(4C*utQ>nNlx>jj#TvVzy4|6qIs zRUGrYK0Xso;snhWdH2=Tkp~ZY27xsW()4BPjhdR2C2tXfNL%}8TI#D| zG#~CKm=CAxE4{)W`q2z*8oB$DM(zsI$er%%^EZlZDm^m6+i8_F>IqM$o^W*|yn_0FFf?BBVl zOX#UtG9s*rwD&6>_m#a`N_VwWH0nHIyv&-^_d(s;Vio$){Py~T{gcJJgpSvhacX_9 zMFRb3#op^L_@7SL9qK<>#=aNMK2{@)xZWe&2fqoN4s_2dgxJZ9}9jYd(!9_NDQ}OINq3xz4&R zsz*F{uS}w3{)&FScPLxh`5>WN%Sh9jvac8P^Y19*jP^fL*N0Z&^n| z^BtK-3b}7+5?4PT9GPFBnUjmwvcMV+39RibtJ=&qk>|%ZcWP})ebT`DuE!}kMw-T! zXq2-CjdHH2kow$!Rk$Z6@yyFbk~Yw4BsXX^5Y-;tP3j69NQR)3sk?XX!NYyp}7zBPlNYgv+!|sS2p_RFl zew0yXokfYu)j62Vc4G6!g_BxR>oqxL2DWb3BB4h=By+Exfjuf6Lbq{|mKoS5>3y7Y z)o;XRVDq<&dtwrUzZe{Oo!(=4x6@TMPOWny@saD?PW%h%cBy4GNxGR-?C)0o2N(X0 z&A?_4BzWXreX za-{rM&-#5Qq|T>ig0Co@wTWqcd^8_}+PkHwy_*eYU^9X3PoypD`zy(jf9UO+NuyI| zU~58WPBMv%?`85w-kspDc{+6lHWOU?=xk8zr)g;+7oisN4w$pe1h!a_rZt^tgyqHT z34Xo0sdKh9p|ebx#KERCXM4h13-*eXVvMr&z=CDYkle&fee=Y?ycGtCR9hWP7VsvohtoKxew zIy(=xqjg(bva;u-`6Yk34I+mdoevN?*DKQ0AEdrPAL<*N{zm4WYZV@cNj$Zxhrck- z>d28ACc)$1I!7+jmi07^JZ{~-Iv+A9#eeKlRp-rO**GmUoUF)y?AX)2vyk9LqB?Z zfM&g9?Rq0L{rg!4!7Wy9``)-&I!!zANou{uQG1sXPliy1ZCv!D_s?nMZbGNsq1o-5 z8w9u2xz*oq&l71{$PKBbUz%F_h1)d`p$c2~=tn(z>ajdFu}f(7xQqs&N75E|dOS_v zU?CBQsgIL&LdFoPuwR3Il)HxdYJ1FbcX)m| zHPcC}ut$e}lre;6C;UjW6W%!cbqHIjc=nlR$zGZ>ahB#x^v!z8Ah5-XH1)h1{}%Dq zJ>{Hw;8X}z9P`^11)sEClbH8!awOB|&pIV&{dOd{oyaq=hmNyV3t7{&PAWakI7zcb zw$j}hTa#%Co)f~?Cd~t&IV|;P4$H^I|1t<{y&`Q{ul+nXa-d&hrys2qhANJEK6UwB zwra`hJ){|1KeUNVpxHaCf4OE5+!o=v1}DF_Rcl$(v{%$G|Bhx^tVx+=q4TBcHZHgH zu#HM}3C&J;gk~osr_4^^8A5!7X+3yWj~w|h8q1&+<(!9UMLAY!0?S33);1iUDN>te zI`ya3-cZFczfn`}s%`jLRHpl-= zv%HbO7Aw-!$N6(^q+_LAJHsUh#O6~+-!#uxlPF8=-RBOjh(9+bbp|#Q*kU!WkGeF5 z+=PfaM4$?gdYt}x8XpYzM0bj(o_^z3QD!fyh#31shxV&=wB=SH4Tg6CQ)?s>= ztbRRzN2Fxk*qrSXL*(wv;~M&Yu3HAwgM7Axe|GrK@#QG%CYFn>V!Y2=R%UvGXUUbb z@kcLIa8QMJYLlp1zl1;kllONmSd==;yZEX&bw}ngAZ`I*Nwfy`TQ&URd%uhCTQ_yi zHWSz?MnAf%ZEfVgJ^0)Bt6$`CP=)t)lX&@u8vfuDmv?Qs`ABTeHn+Tyz>=t?U!F$K zyT2dro=lyy%>=fJk*4P#G{2;L{(bRZ)j6W(m*}=Swgyb1!N8XO&ieQ5{(4~QEbo0w zN~^oRZe^gKWi1=g!+)U1>+zFmJ$i1X>J}@uchQg59H1wPeJak5|GED-qrHo*0h9RZ zy&nEg4a)9*Wn)y$FVU@VB+!p$p8Yh$UvlQr_&+=MHVB?MqWcL*(})+fGHw(o8Gp0; zJ4W9iZM%fWeYqV($8qma|EsuqyK9f=p=PV=ag zJL?p|K{`a7_x-?SF@kB<1qoE)G2IRk{1(_l{|ozg9Qw$4-}QH>k0X6Tf4ixKt-cW& zXLw5H>CfCeFKNi0QtJ2Ed3KSzJc(o5<9(Oyw#VD44fk}S|67p(+wK@>5+gnkn!g34 zEvqvTH+Fox^+KO{NvN_9h)3?_E7K4yh~OisLmr}v^H_xhmSkB!9+fu~-mcdtf<%@Z zvR56qzHQJZfhvh@FGvjFnP>Fx{`~Jnka+Bw$JF=Ms>)^;X<7ve2vkXIdqHA)A$coh z-<@~)NIbPdJeKC%;UY~d2mpa9iES@P^ermy<8=AHgpWjrqK~WN*!9XD7ipS>1O%!i zw!I(`d9Z@|uCAV=cQl~fYLAJ>*#moAr0H$|1ga#qy&%!zW^v{5`)n6SVtjkSxBG?YdDjjdRP4(d>vwarR%6hcg{?yui`w8S@+)r*J?=9n-+WX zspE+IGSRr>JWyZmR~Mgdm{RZRI}Q@4lGyfwM8yU7sNW+)*O3kqdq>LeaisWjF4FYg zHV~+i*!F_N_J?0n9*H>yI!GMaCFkzIFPgYW)6;MuP$jYL1&MXFPAQKAox3LrB28mUK%h!u+Y1u!4}V&D)HzesLE^|8Qn#15(#J*GvXDTP#I_eC z&J1j=JQf$u;2_a0K|GdC8RjBQYd`>jDv50`NDMCCOL=_u-R=+)d#}p9Hfie^7isEk z1A!`uZ7)a^+d5Qv#4qa*LL&2i@o4koBo}E~y%h*lNo;#TV&V(Z%DA*}Y623vUg7!! zY08iX1gfz9Fo~hXMycbtHvV!#u`(Y;xlPqz(gruzIF6-dDcj@JcIrVAF?`|RignTu z3ziDaEi$BO&1E8%H~DzmV}mazpeoxY@tD4PVH%=naoMX5Ez=`xj|rqLYwcG*ROh<% zyEBOn{-sF&Pt-B>JigGCIL_lZMugK6LW>8|^liM>Nqtv;4gMuGy2fYf`?-*Jj@$8m zi9hH#*Ol$I$J>ihS9QBzx1EDT(KGwicQxqU1+GC`NT5n$+Y1s|tE^WZb$0e~kZ3bjJbE@< z=ps$;8vubSiES@PJU6+H@~HpkFb9cfM)8=xZJ~=at-}HYswB3(AW^r>Xw_y&9GU1K zf!74mG+z`5RN*yY64;W#>qB1?+~?HWIX2rq`Y(LtXaZwRFvb7Ejwbjo2eN*luJhD5 zz5Y28+9Q?FttBp-4cJA>jq?`e-VpQP8czH1cGji#wu6M!qM8Wywl%>$Q?0_ix*bA} z7HQrq{V(im58mI*uXBB6t7DQ_j!&!ke@#M{o0g_|uO;Ok)vVEqBrL0RJMnmH>M~d2 zIFI976S!AM(;Ke~Le!AAGMXA)0K*yzf3+vDvffhvh@FGyUf z`e2AX3KSaYBQdNE-#_BKGC$Gpul$6j=Yv3?N@6=5qVHexmB+?){e2|9I4vHBs%&tP zrhY9DsFK+Bf<*SOPAQKhw~LQN`}R_oJn5}>k)|g%0-&`A3&f=V%rN6iA6dpk5BLTBZ3586G&6eVjxh3*Mv#DQMHx2 ze+i*F)N1~4eUXMsy780n!E7c_U zoRWWGCsg97y6(6heD=Z#RbQpX>DBE>NG$a^(p-9KO)Y3SNaURG2n@HU& zJ4VP+u$T7Wvc}K(UL8kjoa&*7a9RTQ3Tb1n!uS^*^F2f2RFAMa6PZm<#dn`u5;2d| za^?P^38sy`ih1xoL#r^>1XKJk?4wE_ITQLj@yEk*t@QfwvlKs}>G?SjsFK+Bg2aR82C4hUo&ARRNc4a7m^!9O z-+t;MP4CeIfhvh@FG%Dm^NI2}c>P5mi6@I6S04Eu-|r$#Z+ZiPDv4>#GC&Num`(lW z-?VD#BXROu@p#Ak*hQK~>wrL&#I_eCwyb_ad2G8Q!AIgq;y3Cz#$NfrMcT5EK$XO{ z7bKEA>OaxHrz;flktp-8cx)TG&qdm@kU*8hwihJ4eeIOT=kHvNAaQ?du6N_S$)81C zq-hR45U7&aPKP+Zu#fT>@X`7R5=AzMM~3RYi?n4Sfhvh@FGyS|Fn@~e;1IBc)m_r5D}oQf^$Rs6! z-Y@;AzXlXd&@Gw4`?tA0i%Z=;X6$xXw`zDhty~5KswB3(AaUPd`8}ro_FV!J_4A2G zht)e%{DihFBv2)>?FESk3k~wQzIyqGX(1%OyL3eT9_!ohc9Ew02N0-|*!F_Nv|Vcb zU2Ail!yzQ{d?g-F58C4*O)GN)fhvh@FG$pRu8BI1>l1P~NIbAkJX-coa*?KI!9bu& zV%rN6FXfkUxMy~jagb;^L_Gd!7;%xdEF@4RF|~IC#Ft|VsN)zryN-iIq?<&hEQN zTNVli;>AUxWM)>k?gmaO+iX*KO+mCb-5yTFRFHhJ7sSp#@U6 zbGZ_yH@1WXmWwo(uJ$U-5&lJ&%RLAk2aY2gBxJUTCUpNJ=)rv)t>V6#jtzo$D&~<& zNFPuWx(CT({ug%eFZ#$?rN0q_2&W~477wIV*@53YwOr{5YY*}k?kXZH#X(?M-(0}AFQkGWn zUg_-||8F97uXq-c5ZWQ^V_AByQja|De-OA=NbB-t?+S1JRs9~kCq2S{#J($u)BCQF zkXXJer0G53uBuHP-crL2U8wS>^7ybp7x%%->=EY`@7vOq?Y76;O#)RC+vyPR4(jXB zQG}Q0SrbA6_Z?}f6M;Y#?z>6+{b6@i@0OaK=v>WtS$#h%M%Q!mb-tvISW|d}gXJFG@t5-Zd~f{}Kkf0~M4ZP2(v*+>Rq@FF@CZl# zBC3r`#G~)Y{~|;c=dmhCNJ*4eron1;9C_yUb&%Np<3;sdwf>`_L7N1sB(}XEv90Q5 zNqmxXzn6S&**_b zmBh9eBr<(bMb*2Pir5Yk8xG60^2UR0U8HGcZXi%4vF!zkzxOp(9?cKua*)955otPi zfj|{rsU|^Lj=3LY?SI|8J~kD-qR!oqZq#$}%%^$C->RN)`2M#uB+UNqZ}p9yn={0H z>>G(|KRM8q?Y76;O#)RCQ_C_yQ`- zULHD7c@(MlN(hO2hKa|oFLZU0roIgjsFK+Bg2cXKU6serwNHeQsP(9Le4M9)i!`kb z4+N?trsrG%V%W7t%ANrlUeBMQxR^SH$RTA4?kT{(E ze2DKjO*(dTka+s?RpqgJdm|TVdeZ_3R7q@mLE_~vmMf2N`F;)(mmU$1>LVMtNYi-* z1ga#qy&#cgeZ2B`NLwe)Pe8qao(04ueh?E zW^d7U%R&NG65Htzt@gCzZ`XR|;7}ilspt9Ijq}3K&rI*=@4B%i71av zGkW?+tbI_<_9X+SyGYY>P9RVvvF!zkd5`>|JZ{|I(MRIrM&i-^#>+0!w7M7&sFK+B zg2b^_IryrzzVFqQ&;+SqKh=OeSkof#I_eC2Igs_JTB(D!$+b| zhm^b8^zkmzmW2eWB&NGsfcU<0FXi#n$lVbnCM*??%jd?pNYgI|1ga#a_Ems5{{B$q zv8a3d2ojqPibve+L>Fnwg9QYtB(}XEk*Bwex3?%fDG3Q|aUf04ihw{Bwna>W&s+Hy zHtLe%^|=iv^@qf9DRqg~(=Egxu*N}}^dZ<4yJ_1ZDWLE_6T(r({9eX)zQWg&qoiES@Pbp7$5@+iHtyMsiJ z1?(XsMMzV=qHhj{e$Q-Gs=V7Ip6xDs6}fw{i!_yTL_CV@>F%IPVjATP5a)l+%4bQq zVdiEAQK_VOTx-3^MVg+H0f8!sZ7)dNz2|Y|@!rt{2Z>*Qlpf2@J_}u>=`A`SP$e;q zcm#+87iuYwjBgflkf^;;JbrDzz(tzo*#UtniK$H;Ai8yLuRMCSzZ^oM;$-o7?5X)K z(v%AV2vkXIdqHA7&HCiu<9NmOAtXw47mxQ(&U2BrEF@4RvF!zkvQ1@#W$}y}AtXL; zA|B!M{^dMZw%Zo-7Ow(_Fw2CO|2y$P$jYL1&LqJ%3E}o3s-cI zunx7YI~IYJ9Ux+5$1~-(q#>SYD0>wiyx2vW=A^b3kFG?ZN@D68 z1c=&$-c)<_)6e}4;=SK_tS`>{^RLA&(sYjk0#y>*=@4(`E2TWTju_z}QD}^KWKLM( zB2BAV0f8!sZ7)a+Jo9`Kf4kjRQo97o#Wo7k)ZRq`S~A#rF^N;->Q`frw{IpoSo@UB z!fjF8n^1n9D{-8PEh~ixrzNnCLYnfW-lb}4tNXE9AuOwSPVuPu#ynTzIFI8P5l%~B zxk%Ica34)k^T_62PV^hDk~S63X)b@4{2o1PZ**n5p6iSRswAfQX#pbdYll_edF8xO zJ`&x3kaKtA=nW};LR%IRsFK+Bf<&buh2t-_G;l5^$lWMX6ZXG>$|{3n%>6& z0#y>z?-3xfosz!uAEPerK?3V2q%8{xRAC)u5+hGatFOn!YkM9T`J1{gwd?(c+hVlD zAJ3ob%68l1?bIIx0#y=Itrj5SXGp6rd#)T2B$_W5kKC&kr1%MKSxBHtV%rN619}Yf z`TCf+{FMk2O^&jMv;dH%OtCKw^mh%tqwBiGJXBB+v> z?wkRl=hiN2ukvR2!63GKzpHQhX4z#f(w2n;swAdWH3CGYH{^}Ou`}-RkyzM3Jou_b z+Oqr^&-tH!JAPZ{dH49JYO<3FdXx3&iZsNz>Eco4&3k-N#VHjMSQ52va>lD8FLAo8 zL0qhHP91r|gR5PnO#)RC)0zVTVoyJLKKSR7IzAF#|DEFT{8|@j%1jCbsw5_l0C6PS zHPyZvv#yxS`_m0jBl915H#QTmkjT!)fD%^LI;A5A6VZYzyY-+6! zo@bSFPZo;hO$&+Bo8yIq#7Ia?vsequalDdobrP2K@KW(Oy>huLah%8TtqI&Kq%Et_ z()(0b?HO| zRcF6qg8Bw4SEL~pZ4i(7|DK45Do&}8z>;Vt$DC$ruf}G{>LW2Pb0)Qi2k%|&B5e|= zlGyfw#GovW^0?6bF&~LWPl-qKC)T=1TNV7D323|YWhe#H$glW9$Dui zZCOa5N@Cj!64j31PiQ~K=F{)Zc<@hcf zPZAPk-xiOz-kzW0C$wcDfhvh@FG#%o*I?x_Z~dqU67DbTA^mftshvnf;Yxifb$-Vr z?#ysgeG5N+wZui5o?@K)4N-!y_&Y~ZXb!?zfRdJ zca=e#1ga#aCnf>n_ow9UY?pk@N20uKsXNZ-jcZ(_DNi*JsFK+Bg2dN3i>u?X>u8mD^tNVI(X4)t9nMJ|L2u`n>z&m8x&8~+ zWSYQO6HM{Hu%ik7%f+SqUCCPz5~ugx1QOaKEiGj$3;GY1r9GP5n3due=W+bM3G@)6 zUA>un{|Faqljv-@!1s(eHLqvOdWoBsU*gJkJ>SP5P^Dtq3lfKR)aCnN_^*@094z-> zqIkspwAhvHLesi~K%h!un&TB9K0C8fd0eR0$3f!s^WqWhw%A45vXDTP#I_eCx;8kf zJRaTuf`i02joCx)A4t<1_ot79+U~lmQs_sMSofUl)xh?PU8F6m(8MFk#!~@6M7{muph{rFR7P&~%GkPFUC9&-ViK%^xI{XW+{pM*0iLbMYN2V_p zx=33V5~z}x-hv1a75tF$$dUAzgT(efrS=(oVS$UZWg&qoiES@PyuPEU^2pXDn}bBT z6XG%N(tHIaBdP7YQc zFMpjFLL$!=@u>a4To-8?p4S66ka7B8~eQOB2BAu0f8!s z=?QOuxc76JQ}plU{0T_t+K%feq%8{xRAHTH5`*q;=5x&$`ZcTbKu_tPHJCKd{q`A& zYd4wi%64A0lApLEfhvjVy9yB7pGi<27g|5zAh9REczkqnL5iQyvxkWD0wAMWksFIlG+y#iE_sKXziznMUNPM(OJTets>>^E1 zErCFl#B`kph<6{^8sXogVBg*j5*y!?-W@+nMVeMBd}3?lr5_%t^j&Y0xH(+*>d(^&!ps_>3%5SG%`x<)mHRdUImealwC)FOw=5)3 zC9&-ViAR1Dk2Z@w+JgjMT}WFN5~#xK&Lrq&qt13dQ}8(SzH>`PZ|9hG|4s1GBF%*U z7k03$Q~P-|O4@J|r`Lu<0?S33%TJxNjb&*S*Km4!unnjG!bhkHjD`3i`_s~f+mh&v zEhyvPJU9D+KjgWAS8ItY+jScb2~}=lML6yX|7bNPevm8EE?rPY^ zASN{xkDpgAa*?K$LV!S(#I_eC&Ri>^JdPyPbdab~MLh2QVWEpO)uKS4N@Cj!5?kgb zD33^nCmbYB7Zi{2*A}=))2IOusFK+Bg2b~8nkbKvQ*$^-+?828PW?IGMVc~t0)Z-t z>6u4>n3GA`a8La6aR`ae&&xPHu-JhP2_nTrw_%#PcV_<64%v zF4C5T1ga#adHMn3dv0ZC9&-Vi6fNrjL+Q`@r4tR z&~+ErQApG51RzkQYq%gWW}mDopERwgQ+Jj;eH*vqO}F8T60b>E;L3K}&3EO3_%DuhV zMcT4{PVry@RTA4?kSKh-z1pi`dxsjt^Zmr*nNmw!q%8{xR7q@mL1N97S5*7z`4))| z5_nHU+Om*972YjP0$Uk)ChD_~@6LLAuwA16!snsJesXlxL3DB$k8Hg zdYt$wpXv!EAD!Y#YsW<+Z=>N3x9_7K$ReJp@@i3bE zA=~xb4d?$bB4g!y)p5+oyT(P@vXDTP#I_eC?6Hrlv%OG`kdMTKMdFd8$VwM! zs#$?RmBh9eB+4C=_k=%f+7t10{y|%36M?GBS^3PTbqD`>D-H2Z ziie#pL2DZlfi!(rb!B#R&2#@odq6JM3AWXk$7ajKFdYgvXDTP#55Z>K%5>a^Qkxe6HY=x*Iis+Ax&?F0f8#4;Y^}u zO8@+1nGg4D?w3Pd6I||`0TQ2iYq~4jrGBItzd)c$V%rN61>4K>+IFqZBq33Gnt0TF zbaslL&@|oy1ga#aH{1e5?ltl(HPaiTBS=)=B_2ao&U2BrEF@4RvF!zksTt(SXsxWD zM3Cri`x-NZm&iJswB3(Akm@WlhPKw`lvxH>L?yu`yg#uA6I|U&yy$f z_DeZS`KXHSk>mJi^~yBFuxjElFn1|mRJ0}ssgS^uENjz`^1OE1=bk}KvU925W8j`O z25l0kl9-;D1c=xEx~bZt#kRNck@#q*cr3Huc9Eth?m(bQVtQ{PKulXIv#CDc+1p3r zgQs(=<8TkJcaf&`MS(z-#5A55AfEVJW>Y=dVwjIau3yDt|M?9r(lnb22vkW-@0bLL zUr$KRmjWXaeI&3QgfzXK2?VOJg=7-grpEe8*HPRe)7v@b^E`E|PydB$I89(IMCtG- z)i-E6I?#aN{uh|+xBIj!H zn0INoi!|k~0RmML^OMoEM25&P<&kAb{SXp6!{Sjo|2P+E%R&NG65C#oa0kh=i9*}Q zB_N?|39b#0rWFK$K$Wgbg2d<6Xw_FcPAxO6OWbzcSEJQ>ocb=-60{=TMHwTD7Fbwa zx8b9bcOq>#<6Gg#@Z3rp&zo;;#2bIb1PbIPqZu5)VeC^?LBy=oCMpX;m&D zP$jYL1&Nn8$(ZHtHlssGES)AEWeN^)k*4*?fIyYRw02v7c&PG=>NpbCe-=XG_nP7n zO6cVxP3!ssfhvh@FG$R-+e~>(ADz`fqWtgD^V&4Ni;FbPO9TQ{64RT-0U}>cS9u(G z_)!OmRx`!p=i{`hqw*7)MjnAcmBcirA0QqXR$O`f`uI~060IK;kJ*cwyGYZMI3Q3Z zvF!zk-lb%I$%;SQI7oawQ+o7Qwl{W>rdg9fph{xf3liH)Zsw7R@O64?7Kv9gipToC z4PB(^$tV!0l9=A+2oTl&d0u%Wbsgp)(PF$@wY<(9($tm~!b+czyCu?8xBo33?~#Z6 zMO0Wbq)S-o6LG38L7LVim)a-HwU7KoR9NGf1bwl5mZ*Odn?J1DpL6C-b|tpG4Ogb5 z#BnNS;eQipX`1^n`=%Nrd+_^2f5No;#TqS@f9 zs@^^O&?p~?zg`!Q9`9~Q@e`VI*8qVkiES@PY@aZN&k}1_|3N+y)3X*-$1yf(y^A!R zi9n!AV#>!7AS$i>T6vT$)6GXBJWxDJmVMhrn&yiFfhvh@FG#%DH<$X&cVv0qN22K= z@z@o=)x*30I}@bGRkAjm8w1xzm+PazN_|YR=G&?>aD2+swAd$4Fbd; zzT~b+o?XyK;>|?y*k66Qi!|j#0s>VMQy(Wl93R+T9Y>Dxmm^4oUKS7T2_sFp$%nOf z-kh6b`_v+rBdB`yOD3d8ZxZW=w|7dO9Z~U6L6dm+n0TDeyVymVPQj6~SJs1 z>U>@M&vJLp4vDucUg^qq%4A2|DJw7#sFIjg?+g&zm%7TMWB-yq5<~CKul#xrTa)4^ zG}R?Qph{v|NhLrGPbjWDwzYlAM`C<4@wjW&Iu~hrM-d2ANo;#TqU;HIY8k53(nn&( zI`L>*e!Yt{&C37+RT9%%TLB`p%a8EyF{fQmABnHC%Dv=TrwuOBG@lO$R7p%v!vn;k z3NpX_(IZ2BByw~YkNVj+(hO6Mg|;jtP$jYL1&MXFW~*_A)r}H;B=DYyH0O#>B~XQT zOOrT7>n!nil{agt2%ftScj9wb-inr3zf*lH0?%-yxpe(6>|Pa1U0+y56K&mc7sd!neW4`#Io*XLTr&o*^@JA@pqCgjQJ zo0X(rd)KJup?8PM_j7Dxf-5mSccl1yOWq#my)maI9Y?)Z(%U{aXRAS!TOsrdZ7UhH zNuWyNI4?+K>?xxLZHHM767A25$MA$W7ir5v0#y>nc|qdFeKIfO@%F_WBs!FTK%FJ; z&o1R6ZCOa5O5!*#NWA{mW9kGFW@ls-O7ipTa4Fswrj`M=VdyVf?9$!^z z;2_a&yLgmXTGU0_vXDTP#BpAbXj50_);6)*I!L@yUas05}zpg1(-)mYM&Y zT&dh2lsW#LQ_i&2vkXIdqHAbyM5dr4FCDrC*UXVymNKjYpBX11%k!X@ne)HqwE2sDgZCOa5N@7|YH9+jY zyhVBZJG8ft1b#nA)3_)QsKW2ZBw8JpzCrY_%trQzig2aO-#N(}(JQr!24+jLQB&K(&1BBmRWhJqm zed@ai60NU^$AI@87in7g3kXz6YlF6FQ1VmPg`U zq-j0_5U7&a_JYLq#lLdBYxQ}ilaEA!xhdaO`^qlTmW2eWB&P2wKO@eMu>NjT}tgmz(_0EMhDfLyH$1&^vo8VdvXOrI_E6E`7=tds$7g1HYS3K4gZ{XgV5LKMVsvx23-67RBs^jR0)Z+# zUrnNQvpMP->{G`)cmEm2Z6DiP9ADqXvy#Rvf0t*etDk?bx*qG}=Mi0-$_QksFDJyF zZ18rIK$XPQ#tjgcOUSd-{EIFnAkndsc-**uWQw2AmW2eWB(}XEF{{-et{K9W%S{a- zarI8|c<+zCF4B}~0|-<}Y*IY^w%FCKp$ZRsLS8SH^T zmBh4)d4R~cwwUrbdgLhwiD6M`Ay0Fgx=7P_2@t4~*!F@%_=60}BTwGe4icj~i$~7) zo^z3=(*p=pNo;#T;&jC4J7;)R+nx>*wJu99`YAaVa<>(VWm&Rsk#Jd%Sx$z!d&~v zUqpp9j!AHxEC0eyxh{p(m>$2!aO{(!s=i8%(|b1q35n%>45aBPSxUatW>wwLLys0y z9-J3-<6RPSzEs(+^Q9tzDv2dus!9BvlKr&RJ!?Wp$ezf)BTe}rfj|}RyGbniK=P$N zLHSY(zxs&!ez;w-K7r#nl_OPRoy+uAgwWD1L7GZ|e5v@C+-Hj`KRy#pkN+m*97CEi znT?cusdrOOR{4vlhJ7O*oC)>Tgs3E6YLJkUXm!f^k}tI~HEcsGR0<)hYk?@6_yPW+LX)|9cswAe? zWPm96x#UZ|Sj={i7&=HiIQuEmG!6#@sw9?tsV33={l-3D=R3a4bK$Sr%2O7eIQUJvE)lN3Cwd{*;`ouTj2K`HQHqW=NN? z(kCPnD$q zi6vjENqlxs8}4~ox$nQjN1}E0l)D;bKSi3>hXVpt5=*{Rlfdk!NW9QSJUII)(q_I? zR7ouPQca@FheOqITy4}og2eUy;=$QZk+v)(P$jYCOErmoz2q6o-lrxdA%QIpq-lH? z2vlLq!X)^&kbhyLF4^bPaR3cvb2hGr0VU#e5v{`T*GMs zV4ic!6STdfP#PL~@FSRP=OGTnVG4bH+ zr$}2C5~z|`@}-(YtwoYAb^G=~4iY)fNSm6opCWBpNT5n$$(L#pm@gHHmdE5b=lM5C zoB2|asIyo0inE_0O=k||OGTB$k}uUHZl02Ssl~H5bC5__Bp#go6lq%D2MAP2EcsGR zqU~PwHhK8#!wC)&b4Q5>XFo;SvXDTP#F8)7By#>P`BLk>Rmef&{Z8V+*-w$C_2Ga( zmBf-S)g*TIYOltxve&yDLL$^qJUII)(zKod5U7$^@}-)@z1#aJkEfqnA3~zylj6bI zPm!iI0f9i3#F8)7Bz81WvslB8=hg@zF{P4taQ0KAsUHXgsw9?tsV32=r;Jk%x-cmL z30<#n{ed*C0|^AGbnO!)ZcdgtEOj;wOn5gUtuW4u+AB$7&VDM}b-q+2P$jWsJT-}C zDcMh3|8!3XiK08igR`F^O|$NSK$XOjFV!TzIoRLl`no{g`5`2VY!DC5eu}hZA%QB1 zC10vZEVer1CWAP}gMSn{QsL@0j)yfAi6vjENo@Y5g7PT)a771+qJzYPv!5bO`TBrBmBfczn#S}SpN?EDU8CaAG{lbbvR9n_ z6lpVGDyk%we5odZ*-w!emq9!@Un_EV&( z76k%T5=*{RlW6e0M`BIU~g#@awEn*UwFBNN_in+NhD)~|+PA^|75?JFP zP4oIP$@>O{@2DNZvbN+A56+P)vCfy8LWI*2ST52ugYM(he5w1}$#1~#E+tKun6sbC zcKz-W5~z|`GM<_QW;dUJbM{lD zEei=$Ni6wNO#-u@B2hkNgoU%8B5meNMU}*oFV!R_bjarL-Qe3@O?@QBJ}7-o&VGtC zttSHnsw9?tsU~r0iR4S|^L5Ba;^98x!P!rdrsq*Wph{xNmueE%Q?j3CqI{`HjM*+8 zoc$DOnu`Mjsw9?tsV4D2leX%+s`%Nz5hPyRBOW~09cdcVr|hTIvQDqq=gWU1sOoi! z3CWjg5|}SFNJu7Bq$w}*XR=z)FXc8zSUMN$!#=d>~jWj{sQ%$JHP zi6vjENn}XLewsx2Qjz#>xOlXne5pv&Iuk&kN@B^EY7)6lNxsxJlrI&DhAGeJIr}Nn z)D{H-RT4|SRFi00O7f)^r+leM6na~Fshs^3Y0E+aRT4|SRFfEbQ1YeTqc4OerwNROc;Fk!m)if0i4mM-F>tfg zSDgJ6XIxO`Rv=I%vE)lNiA*WkPpb@Ekc5QZL*5glEei=$>Ej3z{2l4HIz-yNc=mm(nqB7kzq!rjg)Sl^^4@ip%17^u=->eM;%=|C{Jlg=*?Fbb21C zDkkWoJhWfzIMkjse2b4ZeL`=)HKA$k!34+j9)0)Bku%$6=6$tn*^*bcus!;eI&?T& za<34nLUt*=UA|o;P^Dv5nM8&ff9&}zr4^u6TrTdF-YyA+w2I4pZ+O<^ zO%thaFfr9nJdi+@j#;Hk5+c6G{K)KRf90W7T(15``M1&Ag9NH{%qo+Z{7a&rf92kkW{OIx?ePVt=0#!O@l`ct$ zxzE4gZ>e)!d1w`vo8@BWSk0if3vq~uy|s^r{$2b?B~-P#lsWm$bLCXcU=nRwz2Fxu zBOY2s%2GP!a@A@-5y{G@Vu)LEicOmwC^ynA0N=h4TYO#)RqW)EGG9LJIdmHgA& z%PSA9;&Syh!B>~w9wbnuV^*2O^-WXuym?thY;_&Z^=pmF*^{5FT-Bpbnz|hcROy&K zbV;&T&ty2BRDP1I&8byfZsw=5CEs7Lsz;xgUywkRj#;Hk65_GUlOv^9%l%fXxZGm% zvnCHX7w^$0<`*PTrDIm}4eW|b~U zh#w!y;g_Dky(-- ziHrB>6Y~oasM0a3bV))CUs=n4`ntRipjBM%orSU_U)@&4qfg8)NT5o`tkNY3ao}J( z|H;W$Bm8@46_=auaOUKN<*Rt~iTMQyROy&ix+EdqtHKa`sRGnIwCHaLqmDF*hODGQ{uvSCb^gz|ZIa!iVuc)XzZcWT- zmM!`7Y;vXIHIeSwPG(^ri4GrTOWsv9NSk|wDr_O4->nI}&XG0=RAEc+_6V$fkdAqT z`N%sJ$(DSuZ}6TGxErKkCJ{N6HM!8tARY6dAnc-z?Zgy4)tLrFg^Tzyw z1gdn*DqWHgdFD(G6`w8rTCL)8b^SUvVuC5=cCXM+82~_ErRk|c0zWp-J$(XyUIu5Pk za&`SkHEGN*NT5o`tkNY3(P4ibXM42*%0sKTTwOm>O&aqH5~$KKt8__1Jatbyr(Gp^ zUtg=ZTwOm>O&aqH5~$KKt8__1th=M1GvU$-)#ubIE?3u&RFlU1f&{8`%qm@y5FPW5 zaPFO7PI+h*m#gbXs!3yhK>}4eW|b~Uh{xVabj}xOrTVp6#pTB8#}yT0enA3Nv6wt` zNkW`FkmzLnqX3VjhGQx!SGV-2b(!i%H08kp0#!QZa$_YaV)#EJoaEI7LhPYcT&`}h zQY$&;Cwqkis&vdMU6K%U^YwSm%v!8Gw2I5sEpKY=$NYi>s&vdMU6K%mYjkpkZ&mBP zgtdyx)jbI6wZ!~_1gdn*DqWHgo$sjQ9C8cN_iTl=ip$kKA?kg_{DK6kbj&JUk`PBG zmUW!2@ybK1xLn<%qh4gpFG!$D$E?yN39;c|A*btyGDBLcxLn;crQUGNFG!$D$E?yN z2~qx;tD&N&+NtBvDlS*|IjD~w^9vHF(lM)aNkZ)V>7CHoZ`ACXuvT%oy7xkTo|s>d zK$VVJrArdx@Yi)i?Y>uYWx`s;}4eW|b~UhIMD<;16_=~~ zJKU1d+k*tEbj&J~;C2k1w(Mb{O1GSJYl&M<;=#)F2u&lwvFM3-gg!o&t6MMJ4#Jkx ztqJr%+9Xh=TQAtYk`|dTvR6px?}xu>q)iW0>0gb1|63FK{NXbZRY;p2Na!=1uN99U5J^GZ=+ogs>0#!O@l}R+uJ=`f>sFrG3Y899JWryj}0oAK` z^ojY22NI~#F{^Y*LL98!+qv`7R^_2pT<*tTy&SD~v5H5Zm|u`Um5y1ZOA;b`fmY6* zP8ogvp0$e09a8D#=+(jT9(`hdK>}4eW|b~Uh(e3nCDd3bceQHvf-fNcW15Qa;FTO8lB$T_UIGy6AvU%rDIm zL{k<%AW)@aE;m+^BG!jqa2{Bx=4FJnipw2PWO`K3($d>yuQE6_SW_&tR^`o?kiJ`NmM?ZSIyhk5{ zHVIVem_2k!DaY~m2CwbDDtPpX`2`77>6lfzBq1h55}g&SX6wPT|hGFR~EQ%Y|a4 zsA{-sT=dceIonO*xZlIi^09bm6)8*Un9IeIXq7atr62hq6JO_+Rx#19(D>*ZCCYj9 zF=&%Om5$j%mn6q=Aaf1B+>H{-L#w#lj5Eha=byGc`o#Q#1gdn*DqWHgkM1n)XS(7k z53S;IbLN~7UAn>c=o9k`5~$KKt8__13~F$vpFP@2d1w`v`^dHl(U(Tr9(`hdK>}4e zW|b~Uh#%_ii4@G$OL=G&mpi5R#AviR-9MVA`UMG8>6lfzBq1LDrekE-Qd!kOtGL`l z?xg52~_ErRk|c0n&+OGw5pA2msncGc#4Nsk+PJIS%oFh zT1fu7NS=TDsJ+rECc2-V5It9*sz)D#HVIVem_2k!vR5_w{TXTDcTgT$#pQ+@Oo$e| z6z|a|<`*PTrDIm&=hgNa9R{8PKef{G-`o#Q# z1gdn*DqWHg6>~oCfB0f9<)Kwv?tPobMJwcs_vjPz3lgZ(u~Mb%p%9~Af5CsZ{4v!l z(kd>uX8gG5udi0|=o9k`5~$KKt8__1v|T;WADnrn^3WM zTQA(c(%XXss&vdMlejPW)r1O7%o>hWyX`5_P0vbQqU$TJ`Dj(($E!IbSCmm_iS9LW zKl87n)1p&X$9wdN^*?2=kU*7=S*1%7V%D^x&hmYdhexZp+=Y#%MQ5Fi_vjPz3lgZ( zF{^Y*Li|zbPG|GMR_Zvkip%|C)zs+4yj4B=#QcH;s&vdMU6K$Z{@xktHMW;rwNUQy zf2Kr-R;=pLC*~Ie}^ft`-k2x9>*(n4s9o5;3reI zp$dO(rbLiSk@ko!LGo=*L^p+`{SNbok!gEP)m%XCfUzqQKJnD>huSeERiVmwO zquH8{5lWtxDEjoI=&x0TKw1@^@*mR!?@LIV1gh#Bm>6wdNIY&$;0Q$jt&^kg*OWFj z9|w=47{@_oVIPT8g{DLwYAgiO=3XIzqY+4(1gi2(of2KqT|91&z|jb#O%GJ<{dG#T z(M0jMJpxA~kTyL~)zqCD-L_UdZjZpx2&7F9R4tr8HTv-P;t?Ri!i9Zof8beyXHU$7 zD3idJ1=2Bsg0PRO5BpDyetc8ra^9NYGw$JMgI7`D`k+1He>9&Oh*gayM~Bo6(xR3B zhJ94wwH>%>!|4(K?42AP`m}f;ZF-;z>!<(`^FU%p=_%3rmBa&S(*spl*9M4~2NE-8 zOo@K~}j<{=|(dY}rQ6$FTw2NGu|PK#D3Bpyhc9;m`mwEz+GK%&#iY0>f@$UJ1EO%GJz zXkCC{EX;KY5}oEui|#)nb0Cpc9x4AJ0#rEam@Xk6K={v1i@ttP=8Gb2dY}qNPtzro z2NK`@Gd0>ZBpyhc9;m``<8%q-fdt-hkTyL~h2!71N8lX}Y2`tCB){P1%9Eq?9A33p zu=VmE?Ghkr-#a;aG95a09OM)BQHA3$=oce+#|$FlLTV@0mOVt;Bv6IpNw-HtAD<<6^f*6ncMR)aoZ5NShw0!tuS^BVOq?F?#M5@j%-2KoyQt-X0OMCPx2F z77wIN4^-iJ>+KOZ3XHVrG5hoJ(GSnd8ywjCy?6KcSZ#M}0{i4h-3?`D}lD)r4rTf8`s+BggO1^gyC|w+Ye7@lszQZ4#)$k^kExikF-a?J!3? zkTyL~rJsdxPw4*`I}b3aifwJTV%B3gV&o_o2yKQ5%n)V^8w3$^L_rY~h@hY(QKn58 zFpyNlgeahhiKGbA8ww>$Fb9l>ESNne)W23OzTzwQaR2tXgNaBVFpvdnV8^=$yO(qu))uaz}_m@$Ac+8!cv&Q&n329L{5Wp2_FUIEq&et z@Hfg@p~1)Z*!G4katTxQ?5p;Tg}Sv=t>H4*z>z|E1lbNVn0k5QVAI7O>)WQ`GT7kb zdu)dpOx@RWusN%fW>jmq3^w>R$aa{))Wt^+HoN|%zj_#Nx_r+F?-D2{2n!yHBsD(nO zEw}2)KFPkP=&@H&(idAbc8e*C`Lw|lYN0~oi|sE@nk-o7?guF8i|ru0kM8p{gAJxo z3x!T<%-pj@vQO;>dUSBhe!uj^e!o4|;PcW3Q>caFJo_7NAJ6XTfReUJpu_z`eOUj9$E8wX@e=$LZOoyD~pC#ExtgHg@cm5 z*!Gp{P%)o2m_jX7Xykv}z4_}OX$C0ii)~-KmF)90gAJxo3x!T4 zc?C-PV%yhlCHuUz!4ztt&`FJs=jhC*&lD^n(vs=kNFKsY|S}1f<&p=6EYysM>OP`lEm_jWSI;pXFdS&$GDJ|URIVkCiZASTQ$9&pg3bjz7 z@zwImXrGg7$#qLPP|_FsJ9eMP=V=BTOraJEozxiI{O0JsANQ+}3{cV+TQYV($LFOD zrceuoPHJ4btY6fxf6irqlD^nNvfEfbFKsY|S}1f<?@JxA#C(gstgg+eDaYM*~=#iv92xeQR! z7w1*%nMbA_bbF1P|_D?XzbY^pO-e6LM;?Jsqx5x@8??&>FVwWDCvtcH1_O|&r2Ijp%x0A z)EKsO&*aX2?)8xY<@#pTNW44k2{XMX}a zlVO7?)Y2E7G~>L(+9oxguI>I-prkL((Acv-J}+%Bg<2?dQlt2ti<49Ty;{sxd`R>Dh1rO#mgAJxo3l$o?9tV`H;K@HW%CF$Tyk@Y$6l$SDWBq_}74Njv z6+ED11<#SEJ>pmJU|uuWU<$QRp|Qi@A1f|BL09mAk`+9ie|*HR;K96Ru)!2+p+e)< zFa8s4cdD-70VOMV=G-~jui(MFX0X8&YN0}dSMY$66+9z%e$=nv!MtX$!IZCUMriPQ z98cL5JUiqb^(%P%ytTs>JWQdMTM`<)f(MkW;Q9COkNPzYnAiJp`iWOXrDHy+7*cuX zt4v+J{bPOwPiWM?;Hv1wrn-U$l&r@=Eq%FDCNpkGpJ>9{x`GFk7zcEJ%&*|VyxuA{ zm_jX7Xlzd_ctFVtp21Td^DB5TuNiDGg<7c4;1xWeWCai2Yvl@4%xeZ4OraJkGJe`~B+tSfjx$$A{r?p9Hr{T1-m7be%gp(}VmiLu8o!~F^#%_6+D>N3^tfTEmUam3La3hf@jj25q<>^<~4&2rcetN8oYuB zl&s*Hd;dtkf(P@O!3I;Pg$fN`!2?QG@HA-qpkKj*dCg#hDbzxR2Cv`&B`bKYJNO~L zf(P@O!3I;Pg$fN`!2?QG@Lv4p_3Z8e4d&sZg!MtX$!4ztt zLStyxQ}R2m(G@(PWChQlPapJGU}Ii0M)y7?f16#8(_`W})0ygW`GbB1PiXK89#FC# z2etI&PWIR3XHUwn+pH^iK#8$))kwdB2lINX*kB5^P@%yqctFVto zcOK?f@L*mu*kB5^P@%yqctFVt9&EkH_7&zegAJxo3l$o?(t_WYI_x&eui(MFuHac~ zkNFI=$A07(0QMSX1<&xwqx}jV%Ei@CqJKvV!O8CZqi42j(?{SMV^!k9lbD3ZCi=S)0RlxPk}&MJRqQVP0>QeLCgj zIc5JR;ZLu*w?E`p@WA$l!~bc_KI9?4f`@I_e9OPW4E|hVJ2aSDH{n6Qf@j+XAA#8C z{)hbv9=RXYui#YvS8aA zw#X$+UD^IYzk+AmhCJi2f`?y4sn>_SMe?Q zc;?;@`xQL$evYk||6{v^jI|pd@+)}Q_V>f)vf`{!egDF1VTA0B{f!Pi-iYAWmD|mSCck+l4{@rfd2Je%zy=~)*O(XmY9=1b+ zDL%GPt&x*w`@-Bvzk-MFIsXmA3^qPKaim|t!**ye#Yg@NGxC3r@GE%O4l|hIGZ=*# zr%oN=SMabMW-!HPVhS_(nZb6L!4w~1Da_#K65B2#r%Ablj{@?RKJNkeTV<`#;NyF2 zd&3sFgsC^|s}?JGsx@2&8+?3^?J$F>Q*RsTSMXG8xC}P<_#WF~22)438R=K>RBN~l zHuyEjc9_A`<{BgY3ZB9Ye$BI;$vkdX@Juthf(Khmay1RMYGiE==Jn_Y8%&{g6m8FC zGQ1uKl=Q_`jjXi6yk@Y$6l$SDV-&660VRF0RU<2HFs~VGFojyE(BSnrprkLhgJh)* z<~4&2rcetN8Z~!sk+e8MSMY$6zS!@Vl{T2y3^tfTEmUYs`mAp9_FpaCkyKF97soGT zr48magAJxo3l$o?f(MlJ#c>!}X@hyqV1p^tLWKse-~lClaXd*@+F)KY*kB5^P@%yq zctA;CY=6p18_a748%&`VDl~Wn4=Cx2ZC_bwgL%zhgDKQPg$A$30VRF0?JFy7Fs~VG zFojyE(BKt3prkLhePyK$<~4&2rcetN8oYuBl=Q{6udKAeyk@Y$6l$SDgIDl?lD^pX zm6bM_*9Ei@CqJK(ihvlveE|gn!yHBsD%m*Ucm!O`eM6HR@z`*GuU7XwNRnK zD|kRjUu*%&N*l~;1{+MF7AiD&1rI3ci)}_(X@hyqV1p^tLWM@1!+S>?%5((}DCvuB zMp5DBHS!siL&0vEm)Ix>E zeM|a9E$`PAJfNg6wvc3{4dyk24W>{F6&k#P2bA>1cAKoU!MtX$!4zttLgV(=FNtpc zNLTQHlD^pfl$AD^*9EiAWG`sJk-)Hz{y=Pr*|Nks% z&DfR!n+>Uj-}+0jLiH@uZyROl?>?RR{c)-e4@FvdwFa}cFx|<+cQ|@u^m~=>-}JZDbzxR#=*B&M)xNJ z-AZpz(wA=)<~4&2rcetN8bewh7S(#^B)I}RS21I}srtAywj;ay4HL|udW~Z{vY6Kl zHkd*!RA`)gP&S%abfU`uC4Cofo?ymzX&l?(^E87ErceuoPHJq|rYssgrJ>6JC4JxR z{+#)_PFZY+&r2Ijp%x0A)R?p3?5OUOd$|ly()WL-PBe?=m&JDYytKg-YN60cjh0__ zi=J(`+&!;ANnboOpHFqqs{vmw{ z9a+q41{+MF7AiDO%=C};`~7BjKR`*}j(d+a!=vKZ4xgtPY%qmdD0EWewnw^0FP^-> zWq^{tZOKSOw!`P84W>{F zg-&WLzp7<4^a1xfCOJ^j_qSJ{HsfwAiS6)tX@e=$LZOoyKYV;l^wPV{-2DJ0eep__ z*F5Ia22-eo3XNOa3}}AmVEvYx{zr{-=bhyk+2F^YF~jY5VB3+!yk@Y$6l$SD+4itX@un!yHBsD(l&H7aM!sAxM>zrP)n^nL2qr_G-|8^w0` zytKg-YN60cjsJArF1qTgj){EkfRetq9`v+Xa9^X?4xg7cm_jWSI;rvG14l$peA~)p zfRes<&KYaYoZKk3!{?<9rceuoPHL=aT@f{Gb+pR>C4H-|A8YRXv{7t_&r2Ijp%x0A z)Oe!SdC{bE_i!1Yr0+N9jrHrJFt5g_L(YpPoV7=?Zf^5ZraBglHRJZwZz>FpMzzn2 ziqFstP?pT1mcHD{{;JWUtD}$qwInZ(ASf~J-D#{TX;~E85!j)@6l%#pC%qp{C-#pH zzxaBW0ZRJ5vgs+4=~EQj;q%f4Q>cYPCpG@G-!ZXZ!=x&?AE2Z!-p}Qe0rP2tDbzxR z#)nB|@@=CMmoa6;vu63{MX?>(wnLvaWiyImJF=M93^tfTEmUayGW+J_qziX;e=AVZ zchk+!nk#N7itX@un!yHBsD(l&HR=uTliWI9S15pzzT0=S_o<1!PffPwr46P~3x!T< zG#%eHY5Vkh?tXxhzK3U@HQj0y#di3-w80c=q0mWYNE>t9ir zSL4XKXD9!fvv<;b!R@6?OC2rmnGNrjC7WwE zbhiqW823Lh!OVK0QEW$GhXzxqB?F!Ge(c`v(B$z(`l~&lr0+ScCYXwQ8pU?_ytKg- zYN60cjkhX)$+thav%4Rlr0*S{jW>te&ks9%UfN&^wNU7!Mw1_>YXJ;!|I?A26Rbm_jX7XdGe|H-G09&V=S+FsMzI|}FKsY|S}1f<~9{wR8tDSi!x#+yC*L=zu#8JX$~`^wF-9lXwS_%A~7Ya8== ztIqpwjhrQ4+w!`OX1{+MF77Crz_;voT`OA_^Tm~rVd)B36%_;VG zM(yxcYPCpG%_yD)jW_l_Fu)!2+$v`K)Rc9V}Oj2iXbC&^1`X16}yqSGmS!{>TOB+m~77Crz zczneXN!4q5{0fxx#WP%9E0|9kOraJkH01fD|Kt*!MG}hdEuVD)E&rQK_*@DbeC&PO z2A`E-J2aT$Taq$z>e=6@+VcJ(_k)kn@?Rm$V1thvv+WI=6K3!$m2Gd>B9}15$G@vJ zTm~EbN@Y9DV2Y39S8KQoHu#mwc9_8wpO2{4a2agyE0ygqgDF0$R;}SO*x+{twq1s$ zq?J$EWJ|B@Xd9HMVFvZ8OQiji9gSRZ%4l|hI<6?yw ze5{Ao4l|hIGcko3e5{A@BKFvWWig&BPP z4clP`Q@rI}n8DZIupMSF#d{E;(Rtt7D}FteeY>L&7M7J7Te+TG=mMMPz!}lYW(}$LD7p{ z*1J97eqT*Dw>;U@{WctKiQFgD|F;3#cJPMSnM}X2v#WZ4s=qzZ;Pq*y=W9)4JF@$p zG2L`{rD<$O7W10H22-eo3XPBN?43XT)&BPHoXLQazI>}NuNiDGg<7c4*#6Noqsrg@ zEg8Aye@-zMwrCpLk==a4RCD5$O=CNZ0rkYjH*yq?YTl3NeQ@*wt=%hxC+D}z<|4YA<+*7villx3FAHLW$wqt9a zwKEwum_jXmeJ5ueuuHRw3F8L3`vFS&UVrg4v*Yxpu^m27ZxtI%p%x0A)ady4dCi|4 z=ZcFX904TT{6Y2>S?d|?b#$-W5N_OD4>p)WEmUYUef#?8p4}dkj0~r@ zIeCh?puJwj?C0(M%Vd_^*(;j$iu?75T+@bAOzoqZ#CBw#Ydyt(!yo4LR_$bs2GgIb zIQEpiOPS(~(0KaRUQz93`U@4+8TOWC+0JC>e&q09gyP$ddA(Kp|9Wlo>baBManX-< zea*~zM$c#CmdJfV{eK&}1P`YWDnpw^6S8L(}KEDX&!pr~(h*Xj4VjO?M4&8o@v*GMOqWlz3q zvU%ax#<3k)KkuIHY%qmdZb@id{b28;{)net1}N#vw+i!mKiFUjwNRmPQLkQ6yM_}b zBiFCxE9Tb$jbl5q(_VhXblSfxwj+yq&0vEm)Ix>EM-zHQAN>BT%K#;P{k^q+H_U4W z8%+7yW`xGrr+P(Q4%OGk=+$YqUu`L6(JkBu0c27h9OuVn|B%i?sYRynb zpY3d*mJAsBylOV4S8{Q^=kgK+N_su8=w<(2f_XJ!YZP1K@P(sG@n2l}%9l;;&ia1E zb|zCgwpX%eEzQUfh1y!#&^UIgAJxo3l$o5pMA9I+Ln4161G@n8@I>Esph?z z&0;(Jwy$Qe!4ztt&`FISckG+LD%U@ezZEFyyJ5en=GaNiVmo|Z+F%N`Q0Sz_HTCD` z|9-!_%K#;Pj~F+_Ts*Q_Y=_TF8%&`V3Z2wwcB@ zFojwubW&r=TlJHE=eBSeprmij&nKH9?V81Q_`I~i6l$T+NsapNwMdR^Qr~5OlD?Y< zPBw?^(=4{b=cNs%Pz!}lYAhUoUeY_ayUPG2een#J*9zv-22-eo3JrNa=|8!I_aJ!R zDcqX?Z{JE1erLctj=LrN`rj&81D~lv@#hCV2lakzRYHTe6WHF$%dKLHKbHzK_|t&x zFoU=5_%G_WgY5ka4ZQ3B^Y0V<-AJ*I$Cgh{F@n#fZT@wc3f`j%GWebcc5thh;^$Ri z2LG+trigz$f^2a1whi9?WIHsN;zw=U25;Rn#m|K>BQUn?ZOfy{c4+V(FTWcUX7Ii& z+hGP%{H|7*!TYjohZ+3-!FzYxelKBzkM*z}W-!HjjfENf`O3D>$jN&NQ@r9;LlgK!wjbQ5vFYDIQ znHS{UudB#w;>8OS^Wf>aWr=zH?SbO&Z;Z|!(#~zey}5L*nRR4YY)5wN%X3Y)Ys+Fg zvY2=8t{FC%LM>Eie6{cOQOn22xC~Iz_xlUynuESCi|z1vn!yHBsD(l&HI{vGS#s3iUgbIp&f%40ixUfN&^wNU7!#=G~P7VX;n0JqHmO8S2Cs4>g$EsyQ+d1-?w z)Iy@q+}-|dev=C3!(V>^6a+F%N`Q0Sz_k_r1q^L{(cWq^{tO()GU zl|PopcKE!s!4ztt&`FKSAFr+G5MAyvKuO;}_L*azKe$P3htEqJOraJEozz&m`iY8v zb-dnXfRer+pEldv(WFUihtEqJOraJEoz(dGKgU%}Zhe!>0406DoSFE&JIt$5e86!P z-&ut_Cd03D{1>74wT*ebRqxDQ-2Cm=^>}-Y z+#FN1vpxD@?=4=b@|s8ee;crE2XBa-$&~Ckuxf=}887c#ADx-^-=xxfhs2CKsXVqL zi+RmpgDKQPg+{x<7v|47Sg$YzC4J{SotW~H^4N|n<~4&2rcetN8b{4e@>gE$)=gwU zN#C~n&NfpHEsyQ+d78lnQ>cYPCpG@OqDJ!2RJU#-14{a~xOBGZvU7QChtEqJOraJE zoz$4r?cn6V6WlTV3@GWl_f4}+^k-RYhtEqJOraJEozyrWcWkn`nOnV_0VRD$&zo&l ze_R&Z;q%f4Q>cYPCp9*9Y?~BaP}@DPKuO;kHRhNNQ_EsId|ujM3bjz^q{eo~bxt~$ z{Zb*%T~N|@eDgUbUs)F0;q%f4Q>cYPCpGSD+AF#DQumwp8Bo%<(dBc@O(&PdcKE!s z!4ztt&`FKchTNDeYjc*nAE2Z!ziKg`Hkd*!RA_W+Um4B6^I=&xk;~*}ng=_U#dc)x zx^<>`rbk(9hyC^wo!1ODm_qHSz&LELo1>54I9TpS4wUrmckfJ7=l-(T4xgtPY%qmd zD0EWen$5kV-H(3CWq^{tiyxb5^5gAeK7MOn+F%N`Q0Sz_wCR^c)4pHtGC)b+eP5et z+RrJA?eKYNgDKQPp_3YW?Rk2%e#rjv`pAKjzSF;&X`cA3EVjevr46P~3x!T>B%8TnUPY=_TF8%&`V3Z2y0`?md}C*L~VWq^{t^}5b7PaaSn+u`%l z22-eoLMJueJY`kI4M$$#GC)b+c2j4WhmNw}4s%qw&r2Ijp%x0A)c8-gCn_$v?s}I2 zO8S-_RAshnS{~cs^U?-WsD(l&H9FpPY{h}?Z*m!+r0>;Js!ZIrJhsEr(+c}zL zT71wrwj+yq&0vEm)IxuP&=FZKHV>^6a+F%N`Q0Sz_+s{W)%PCox0ZRJTnL5)vx@TEzhtEqJ zOraJEoz&>x=z{3L19x>9prmh2`<^)Lu(H?=pO-e6LM;?JsS!`_9yK)c^YWO3lDIGo67(teVg4j)2wM-7Te+T(gstgg+eDaYF=0w z4S#x=yG{m_^u=eNd?sQ(Z7_vesL*J6-QbE|JLokK2I~) zU<$QR=%mI0oqI(`jF{*$KuOXgQI_`I~i6l$T+NsZH1UlMhSesvk3r0?ck z=9--^Dvj;%d1-?w)Iyr0*`%jQRC}(%254mo}I}EfhMbai%#Y zD*0Mh(See_2b^cjr87%oJA7W+U<$QR=%mJVP4|eF9&?_%AE2b~oRxFT!T&9d?eKYN zgDKQPp_3Ymk9@o0{$AZ&1}Nz}#O{A=-nVgVhtEqJOraJEozyt{o5w3ozg>@IfRes= zrOIm_^J#-A)IxkacoBx^P0g1Q>cXs zje!rfjCSdu-HeH`LMR(e7t-G@*J91fKR^ML~+mXe*X0X8&YN0~ohgN4-{C%@K?vn#0 zeOFAGZGIkK6x-qRG=mMMPz!}lYW%0ps};%K*SgmSDCzsx&^hLe6-BWfJ}+%Bg<2?d zQsb_Y9i#kX7rG2k(ig8Hc|Br2Z7_vesL*J2*TAISfC_nDWd?jT!z{m~B(@`Kew<;l zjY?uW>~~1%yk@Y$6l$SDy z^!?!4ndaMHiefu_UfN&^wNU7!#(`J=od0lAXO{s=`kuYdEc5>2qSy|fmo}I}EfhMb zaqx+g@?Y)S%VmI)zMp<B@FojwubW-EzcdoCRKg7K!WcXsjb|4vu9~&w+mo6$oMkS& zxx^jQ$17D{^Qbk0413+{Rs*%|;0>`enQK-IYd)!io>Ba$DsOflRvg=ry>^eh>HKhU zY)2OJn!yHBsD%oR{vY+NIOTf1{tA@zojbJ3%o<-D+u`#xgAJxo3x!Ti(@-{UfN&^ zwNU7!M%M!yM0eHH>#smb-yf1$X1le;u^m1yZ7_veD0EWe$VXd8O=lnO?guF8d&2#* zOzDm#u^m1yZ7_veD0EUI*}G$O)#B}41}N!!*%h{Fg-&WTy1iG@a-O@2H3LfezI4nSvwT0hjk4d?ytKg- zYN60cje)OSn*1>2dv`xTN#BzF=a^-glGqNPmo}I}EfhMbaan^?lFf5#x#un@={x3| z+2-#x_S=ou6#Kli!4ztt&`FJp#vY$ciJG_!P}28?S+mXg%Zg(=d|ujM3bjz^q(;$; zdnbD}I@@J{lD^~am~Dp5Dvs^&d1-?w)Iy3dW(+w3u^IJU#* zr46P~3x!T<%zXRae8)O{T?Q!W+w9ZC?Dj-)Y=_TF8%&`V3Z2v#(D{J;&&S{FGC)b+ zKe{Al?a1QT4xg7cm_jWSI;pWZimC>`rk}N-q%S@#<#QMFX@e=$LWM^A$IeSe4&6PH z_r(2oo@1VSt|Yc2yZMMYrq_s)*p4jbHG>VNPzx0ryS{dH^7W-lDkKAx^sUi&j(ON_ zquAl|G=mMMPz!}lYE0O*fAag4?pw?=prmisz9-J;RubFc^U?-WsD(l&HM%sZOn%?^ zgzP(KKuKS`bIN-#=FVNPzx0r$Lzi-U%cL}yUT!*zDGSj+hpId`-AUn&C?7vm_jWSI;pX;#X-rSJx_J_ z1C;cA>EqevsyQXG9X>B@FojwubW-Ee%}tUXA06j1KuKRb`{a3y`Lw|lYN0~oiXM06 zpUC%h8AI;Ko9B)#jqS+3enny??O7Vzk;S}bu)!2+p+e)OgGT1B+Ov<#0406#sLA7x zdCg#hDbzxR#`N};$&Qz~bM%>thBM4V6=ks<*^iseFeiQ2IJP5;dCg#hDbzxR#;CLV zCv)HH?_TGiq;Gu53^VHa#<3kfPcztH3bjz^q{eM0bWeUNUgR=BN#D))%`hkSX&l?( z^U?-WsD(l&H7=}ue$s5-Ztn2_C4KK*FvF~D(>S)n=cNs%Pz!}lYCQaLlyn}Hbs3l*V@WytKg-YN60c zjc4}QK6&Mqj_!VdlD^A#n`w@oR~p;l^U?-WsD(l&H5Pt0E_HC4KQKlGh{V z(*{$hg$j*&i|?O#`HmNdypVB0@!(UCO8Ei0xS}1f<#`!S>F_x!33m$(d2(s%eDubUcQ zmB)7YytKg-YN60cjT=rmBw792$u0ww^!>B<>*n1_<*^+;FKsY|S}1f<KdOtwr{?i;A}9r46P~ z3x!T<%=qi7q<+5--ChwW>AR@M472CDve*uvmo}I}EfhMbQF=w+$aa{)6dye;%;4(<*$y+9;&;x%48C5F?J$EWe%Ic%!7JH#?Fz4H2{YK> zm8EQl22;ESr!a$8ma-jYFvV+$3Nv_RDcfNNQ@kdsFoRc?vK?kH#cR6?Gk9ew+hGP% zyhg1sgIAWa9cD1aYwZd%cx5TuVFpvYX0R}WSC+CJW-!HT9}6>hWhvWX22;HLqcDSy zq_G`lFvaUi3N!df8rwc2Cwq`g@%or*4XcI*9~WcWXE=i?UguM-;cgWhd^CdXFoP*x zuT+@9Ms& z9cD1aSF}}YxC}P$=zuGnnElR|_-vx-PcE45s)B+`tZ|1V2ZDZ zF3jNT$k+}unBr?hL*tw~`$rod?BkBp!>D%Cc z^X;#DHi_-^LJ);iYSE?$&P#0VRE}IChCYqlkIU*nfTf{C9WVlniLN`*fyucy+Pq*j&#jhQ_m- z>gN+{$nyo1C9|ldFL$!vTl>gU`Pv(Lr;MK#FEXw6ZxY)P*rCA`YRTX{`}>2*hWw+q zT;?)BN#7SgTWI$Bs64hKi+R20Y%qmdsL<%~SIy+DW6p3HprkLJuky^tyk@Y$6l$SD zqvNxkn*aJ__$(2sYj&wQ=L~&3@R;j2G@Y@yGOAg6q&w$z*@P9Q_Kjt+9ob)>USVE+ zrYyF@-a?(%Tg3)bsD%oRABNr>-Sg=l?sX1I`sRkNFiSU-#di2S&0vEm)Iy9^2vb(gstgg+eDaYF*bj>Nc#A%K#;P zf9B@FojwubW&r? z+Z!wX_lvIX2PJ*CzkQkc;K(Mi9X>B@FojwubW)@4y0I0eijEj2wKD~;{Qny$;tX>&_s zJF=Kh8%&`VDm4Ck&*qA~U%5E4A0IhT(zoj0%k8&|mD+C?+nT2tY%qmdD0EU|K+W3G zwBhbIS#zMI@66klo73tvj_vSyX@e=$LZOoycg~BVeIImJY~?^n-x+I{n-4E&9NXdZ z(gstgg+eDaZe4JG^mKk#_qPHiefKM0VTO-t9NXdZ(gstgg+eDaIxoID`fV3?HEs@+ z^nJ4L3Uk@#jbl4}UfN&^wNU7!#;qm&qt;V(B`YZDd*tX9=C!(Iu^m1yZ7_veD0EUI z+qg1%qjZd1jhh1{eep>qpNW`H8%&`VDm1E&-@D@9*Wc_OkD61Km|uI@mGHevv(bdN z%(=JOE9h=3&0=0N*kB5^P@yq#;29O?J*_KQK}lb{isbc(dCg#hDbzxRMvb_C#k`LF z-Ti2~dV$$}pVHWlZ1eexOzTriV>_~#*9EitUKa>iqb~?}z_eLX65Eme_P-0vv)`1&c4RTH8Ei0xTBy*t=%>o4 z>-D2u1}N!^dn_}VE?sC^|F1Z< zBa3;>V1p^tLWM@dTTY73op6}T0405&Z?Vv<+_faO!{=!R8%&`V3Z2yWs$WAa9X>B@Fojwu zbW)?i_yN(9NnLb%m-El~>$dQSz9s-~lClziYF|-1Sm%Y=_U& z3^tfTEfhMb@j}JN6&pwBN+eLyck{A^X0ctJX@}2C8%&`V3Z2xL(ywOp>%F=M2}=6n zl`5}!%%=^ePzx0rf1P`M^7U>{y65h_hb%LzM%z`tqwT7c-IkfI_PJ|^{Vnt@^VZH} z*kB5^WQ4{AL#|2gTQJvUfReto-d$>rZdMZ8;q&x$i%bfT^acqarOB+m~77Crz7`t08|InxU zZC0S9Z|6F1nW^@@#15aAHkd*!6gsJ~Q?tGDQwQowJy6p3-y@fp#df8h9X>B@Fojwu zbW&r`?nhU>zvWmTDCvuLPFbmk`Lw|lYN0}--NMDqXKz{Ef7UfC{OW%HO0}!V zmx?c58sIWON#C1VEH%wvD~j#NVqP=YU<$QRq0zWqRmG&0JzNGT>AQX1W#*REMX?<| zPcztH3bjz^q(+y1J4DCqeUZxmC4J5OWoG*R#jzbeFKsY|S}1f<wVB@FojwubW&r{O?{)|PP(T;ULT;OFTbKNpEj66EmUYcv3H+jyWK}hMy7e6 zd8X&D_A}$x;%tWr^UT0;#jzb(%xeZ4OraJkG%g)-MKX2LS1tpT^c}o*o*8s`acqar z(+oD4LM;?JsnO@SGm=9$*ObRR14{bdR&Tz!sjN7*!{?<9rceuoPHG%6s3hq<#C;2G z29)%j)N{URT(dZ~!{?<9rceuoPHOyo{{cz9_ggj@A{qprr3Rofep5?KkPz;q%f4Q>cYPCpBuX8=wEPhOVLmC4IlESZF%g z-wCwC=cNs%Pz!}lYE1j<*!*^FZgPJsP}28~qD7{S{U#kdd|ujM3bjz^q{ayo+E>+m z(S1f`KuKSG%E&kAU_Nayg<7c4So&jSvg?jd$T5J-m<#5aRX^En>Yqxow|1ImI`l1x z?a2ChYiBZSFojw&LgUxZ1|`!En=Qw$GN7a{Ua9h$$GqMTHkd*!RA|_@sl>L=Nrt3f z*hzm!(ccn#pM34^#}-3`+&>Mm?bvEqJCo@?xO>w3=>_h+@4|NT%);emu^m27GuU7XwNU7!#+aWflcf)ja?dMJ(ieYe`RignZ7_vesL+sy z4v!+AoyK2O&TXUCjBOdP*^pX!Se(x1Im3G{H>o;J=NwtPZ2^)MSpKWQ6e{u;^{9G!`z+YD$1Gdp${x_E}#gE#y4LRyK>$-ou&TWPq zHCkm?mh)q-8Ejns?E=$ddD;$d6;u2d<;P~*Mw>krnlld7-y2~&G??1hY@s>n!fhBi z^>PWn_wli}@EF@CYBe6)^l;kIuT8+_cD?eJDH#YdgD zZTS5@`^@0&Pu?!|8SZ|t!AEY`_J%ET2~)fsU9I6V*x(~KY=;?4@%})yhRa}skKC{w zW-!J3HPsp}gAG1%!*-a#6z`uEX7FAk+hGPj8~EK|+pk(S_<6;4n88%(=tXAH+4^2m zn89az*bXz8>T=N%Gpny=6lU<*CAPy1rp~zkEwkFZ0)D~mOwFoVysvmItIb@Ya%=EyHKqcDTd zva=m#Fg3pBGV}N!no*d+XW7{fGniUcy3D+BkbbHaX7E{dw!;jj`nOwV_A1tl!VEsk z&UTo=)VJp>Gsm5#8HE{qmYwY|gQ=%3SY~eRrWq+Cr(Q1MBiQ_&$nUN`!&;%i$EMl# zhAnalQ+!0QTEk_q!N;cA_8HD#ijQnoYq(qW(ZGe~+q?De!`oE6<>WI`MuQ~_&CKa( zJ2aT$s~9;iH2BI2egyfE-L}Ek3$h&=ObtF`nfZOV-jBizzFv^+FoUU;EtZ)>qTaz{T3kEQ{>kh73HG}OigDJjxyfCBXK1)oKEq^Pv!wjbQy7|J4es3>vzlte;X|}@*rf@B1 zwMI@o`)lUZmmhPs!wjbQ8qvZGevYy2GUQg-kxTfTDSxW*r=2sl{3|s0Y$)5_a2ZVT z@!e_-tL73uYr%W;yr=InY=8MDH28c3+sf*{a|u&?byLd7RcG+|2)4rvruZtYl;Jbj z;PVk|hZ#)q6)7phXRyKNBiIfznBps4Qiji9gU?5>9cD1aSL~z=pAi^a&X~w+knJ#o z&sy-6M=8T+u)*ge*bXz8;wz|9hR{Fg-&X8 zpEfXRF|CO^Ck#sZ;`pUK(wW74+F%N`P@(a4d5@^e4YOSaDCvu>dwXou=V=BTOraJE zozysb+__QJuK$vAcR5hf7kd_V@51M$4W>{Fg-&WbH>M)0`}t8W1C;c|mWAC1@p);3 zDbzxtlNvQA9UjekzO~B$C4I4tVz+F3UfN&^wNU7!#v}D>L?3^o*M5MKzSyd<+dn=p zZ7_veD0EVzvhVDQoPFHo@c<=#u~lQYe|%orU<$QR=%hxyq1`JkIb5&B0VRF0Rb#h* zd|ujM3bjz^q{h*Uhc%zs!JV(ofs(%1Mv-3)#eCXe3bjz7@yYW;tJ-$dbHbpcFScsz zHm}dq3^tfTEfhMbk&L(^KYgJ4TV+5=Uu;L)ZFirSHkd*!6gsK#X!lCXl&w!G? z*dMU_AU-c`FojwubW&rlT0176PjbIFl>sGvv0r2NrF>r6U<$QR=%mKw57=uU4{jyT z-3%z{i~TdZPw4Z~22-eoLMJumjf|4kZ@Kk28Bo#}`5NJ}+%Bg<2?dQsep>1CzFOPR>gPDCvtMoAzj`&r2Ij zp%x0A)EKb-+T{FaCc6w!(icZ)?NMQ$mo}I}EfhMbG3@b+lZTgWb{U|gFOD?ZquV|& zZ7_veD0EVz-=sFlK_zt(`CEaKzBpoTkJ9_Rw80c=q0mWGf8H%K#;Papd2g zZSZ+%gDKQPp_3YS9wDdfe0ZRJf42C^x;`7o5Q>cYPCp8AOc{^X#t((gLC4F%w z#-9E0d1-?w)Iy?&m8|U-V22-eoLMJuOy6%wtyq`1!l=Q_JK6_Tt=cNs%Pz!}lYBX(~%hz~cuRRAP zeR*#J^J#-AU)zk(kk^GAF_3@Xd&rmW+9>Ij{ogzOIw{neA!Kz1Y`Ojh2Cl`)MQVi^ zV%+j$qu366mA7X9|Baqy4c&1+w%slIN5)o43_Dx~@^E|fmYsghyY}8zZ(x4g25e-A zA+@_z@|Vp?CDchR8@b!g25S6u^|27^pN80WWMLpfx~ny9#AiVU8^{(~{z)6KkpX)v zEfpxay;9>Zig~gBZ==!9`m29z2S!f*3sX|tk^QIPEcdwIbI5z!G|)+C`9~jfHc%r2 zd5-pvpir_dRqi<(sMC+&KMkyEg&}$FCdsXm9QW7d3^p*oZA1P(|1|9XzxDCRA>+a0 z^w=~TsMGgD{tFvY+uO;{6I4a(m>TT*7}VrjX%{oZ$a7_%UGHvW|BD<1+AU zP>SEX^gCIcvE^U61n(J=E*W??;P;qq8=S#*X#A7H>#lGE_el)cVTSw{PLG4Rf5;)TOB+m~77Crzxcs+{(fcQE=icE!N#C{K zd}AgbRUX^n^U?-WsD(l&HGZwtDr#`wkuC$2^xePHH|8OG1-2bNFKsY|S}1fSs2-!cUyedkQxWKLLI9^2vb(gstgg+eDahV8R+^xu9R-2DJ0ecNr`Xg;pdB(}rn zr46P~3x!TNS`~H3#&0Y3ad+hLeX@e=$LZOoyjpIuyF8Dxy=LeMZ zUDoky{|z*lSL2mdmsGU0Mw3$>C}E0UgQ0PMyGts*d0#WCGwdrj%XauW$A1xuU)z}1 zTUB~tQMBm!Qu$QNy?OXIrp<}Pu^rh}cYI^MyRJC4Ba8X8!4zttLgSc^+D83n9_lhc zN#AyVeq(O5ziVlS&(jPxm_jWSI;k;X>BZ6Ihi|Ts`vFS&F7ENISzWs%w!`P84W>{F zg-&Xm^zOCMuKQ1M8K9)^@;AOUJx7+rcKE!s!4ztt&`FKQ+uazwvfKGC1C;dr&A#ux zb$DrPhtEqJOraJEozxh5b!Bv4`91Ee3@GV~cV~H@$9&pg3bjz7F)v%xyv-av>MYMb zyDBJ_l|i!?Z7{nGDT?iI&q|rs3^tfTEfhMbG3bPP74;r)mq~l=NMB`$n_F?4sBXpO-e6LM;?JsWEEl+KOvhUhXnL zN#CaDZ!$f8E{g5&d1-?w)IyB@FojwubW)?d#SY1TPjF`xGoYkztqa$h6W%R~?eKYNgDKQP zp_3X14$J2+dsNRZfs($*9JbD!G^r@I!{?<9rceuoPHO!7m@D(&_tvvyprr3!yRSFx zhZV(k_`I~i6l$T+NsVvYK3w%vdp+9+O8Vm6S>ER{pEj66EmUZn*1dVvS2Myr7TGiD zFk-z~Zoj?N4!>2S8Ei0xS}4i0UABDUjJ>~B{;HjCPUQ6gO8Pe0yv}dKVO}$?d7xJQ zVrvw&|7j{ycZ^tP>POl)G=>hXl|N@o1}IBrQA=O$l*zpK!&CXDpXm1|f)eAg$Jd$$ z_S;+S2<*^c3bkaQlirVY8@|rR#ro~7prr4?Z?7@ud|4jb;q%f4Q>cYPCpAv{W&dPZ za+>?=f|9;ZAF{^uda^vW!{?<9rceuoPHJrUp){GePm#+2C4Gn7yxKf>s{L-{Q@7@& z4W>{Fg-&X`+48KU)~^3{8K9)^PJgX3E59#`?eKYNgDKQPp_3ZjcDgFLX2i<8JQG1l z-*?8YGUwatsqOH2X@e=$LZOoyljA-~gI9;U3{cW{V8>M^`A=DFhtEqJOraJEoz&=g z(9Ow%(+_ePprr4gN3Sw_-rP90!{?<9rceuoPHOCADwF&7Z{&_lfReu0PLM4Q%%=^e zPzx0r@;KOka`yic{wwmmegB&^rpL*8m9C?={41C6yPDMY+h^Q6PWTSD)yXB?_uv=S zm?Ha&&~mG)&2YDh4gUMEy){AZ2UBMZTw~T>s~OcAE`tsJ`>-8m1k^Qa%&Jv-JbBv& z-$Q;)@LxU5VB>+3wI;qx9|N{SgDHM(7iLT!vevwm*9^A945s)!sxafo-`ASH_Psx`+T$9LHdGnnGfjKYk1->)+>iZz4nFoP-nv@FcHu+Mt4@0RPr z*$y+9;!pi;8~m!hc>0y1<@+&yZV1xG>*$xe+Mx6AuY5J^Y6lU;VBimsHQ@_mn z+RUA+8HE|V*T{C5!PN2-Hk!<8%_z*^y+*df45r#m+-P>IrRUYEHFEL}clDd=&Byjz z7UfmM@3q^01licF^?Ebyv9ulDDyDd=nDe%6?EJ<$bL}gd!FFgc#as7<8STzkX9h3T z47S4zrg$%m0z3fwyXdx%;0mIY=;?49eK&uW|aMv7}?e; z%;0mIY=;?4J^A4VGc4AO!VEsQ$#$5*)Fr2EFqfX98HE|LHHl-0Z2OFyY>P4_wOtM2 z{#Ml*Rt=4R?!CaaS5VzunKbybk30H-_YC_!mBo9MeP7ICULKp!U<$QRq0w;YjmeW6 z&U8m{KuKS`*V^}YpQjmYFojwubW)@4A3c+~Ltk|nprkK8GwkP-&r2Ijp%x0A)YxHo z$K=QF^tudC(ifk7_Vd=~r46P~3x!T~z#oN!ON<%K+v2ZrSs)dtW{;ZD4;%DAYoslNu-1-zDj@=mNbT)E9enb}urpGZ{9R zLM?qcFO&J~t%dn5g<7c4C?0)dzCq*uE(4VG#U8fZ ztM_@D!3I;Pg+eDaF23%ms(p&}+yp4;i~UUbwrR|#4W>{F6&i=#cXabXTfWg6l=Q_O ztKHA_d78lnQ>cYPCpA`HRjcB^yXg53P|_FsxOQ*Y=cNs%Pz!}lYSbI^SVhI_*Sp69 zl=Q_uuH755F|_yEp9f(gstgg+eDao}ac~bnJ7d zy9`j$7yGz&Z`kLh4W>{Fg-&X$-@hnYu&LB#fReu0$F+OIJ}+%Bg<2?dQsdK4+S{|l z2e}MT(ii)5F|_yEp9f(gstgg+eDazPP-1 z^!qE%xC~Iz7yGz&Z`kLh4W>{Fg-&XW{9<4(K|u5cM-;Ov4uqv7-PR1%^yWc-xC~Iz7v~V{*#@7d8Ei0xS}1f<s+9uFSf$%*#@7NHkd*!6gsJK`>ILJ|Fyqf4+l#6$|tgH-OFle%%=^ePzx0r zJ%9Ua)`?%}bs3>oPz|U+e?g{Z5~kHkd*!6gsKV=(msZZJ)WyWq^{t*q62Y&pt10 zFojwubW-E)UG`2+c=~LY0ZRH}pWGe?@Of#2DbzxtlN!CAKOs50Rk_OmC4F&h!5+`> zd1-?w)IyjLQHeef=@3uNwQjw850GZ3a52ar|yKB`vxaxeQO) zzBu+~kN0iOvvwxK22-e|ukYlH&t9oa{{Eqje4b}ONnh;6%kcor>#bsgDbzy!!+7JS zsP3_cyU)QXBYrfsmo$#;$nG-wN3+uYN~IlH%x}pcgDKQPg~oeV_K)6ws-MdMC4Ki? z{G%ytSr*&j^E87ErceuoPHN0r(mne1{P`{el=NMh`N@28OId7(&r2Ijp%x0A)Yx!( zhv@w?-F22ZP}29tlYcTt%_@uS@Of#2DbzxtlNv9*ePXofGIyP24wUpgb;wWV<1fo% zJA7W+U<$QR=%mKEMMp%no3)nLc@C8Ht^Ds#=KP(?V>^6a+F%N`Q0Sz_@&VgLJAc^G zWq^{tH?;cM%ssq3w!`P84W>{Fg-&V=Ju_c%=(GCGEuf_D+9^Mqear1HB9w2+|U$v6^k=fYld-L3SJy(ENs=Ve=YsR(=*tUZ=#Li^8o_I&q z;eEDT%lZ8O+|g6HmhXv!UV1p^tLWRb>YtP9S_q;KY`vFS&o_Xib z{#s7VYsLk+bMj~PxG{;ZA3dF^|73nPpV*a?LWRZwcb}90^6a+F%N`Q0Sz_L#-}OYV7h?UY;eOr0+5Be{XJCSr*&j^U?-WsD(l& zHICWbGr4+*9@z#ZeJ{QFd$X#mJ@eDG%;%*IrhIKP&}oaYaX_+mNhfzdJZ1axYtYYI zJCiwv45m;^-_SU=?7rsPUmm_{g_`{8FJ>CnjMA$)lNt7NWpu!?!)M7~cgl#(X7``% zuN?nenr&k1lecdi+hN}sbYAZV8%&`VDl|4Vtc=cWJJua90VREZ=(X8A^-km14xgtP zY%qmdD0EU|%&YyQF}L=1e_c@0_xrk=&7Iel#di3-w80c=q0mWcYPCp9iQWc%oyejQx~DCzrYm*335J(|RJ_`I~i6l$T+NsZTkm{D=W9r|ei zO8TyNIz>3iM!U;O7F=GFMUcc+T~$Jlv* zNl|QXzhE&TVn9VPA%8$dFbwRny9hh1r6@@;TmvegsE8m4ND_fI01}KKC@P3KXA!Tk zjXeew70d|}7c*c$B?$7>sk5i|J=-(;EzeWeb9>)ky;WV+-Br~!GpXOlhSz+(*Fsd` zb*_n*2b@>-rX%P&&qcVqLkekQ@LnQ+A(cGCX*3|mxm2lHPjotZZ@-oi%zymv`16Ae zR&I=LpV`j3l#=5~0#y=|N)u=F4$8WGFgoL^5r~TNZMAGuwCK5Z)}@pjXAdM$B{8Wq zQP6lr+24oo`jx0C-}%pOj&Av(opmYpV-F-yB{8WaCnh@V-yn0eJ;T>SRFv=E=WmJD zGNdi@IOy{bygiIVb`-sd_t#~~#R=IqC+PEd!{o+FFQk9>hjX?rc5>vi$ zPM%o#dAH1_RtNfeh>G&9KkA?8pBD?QOR*o93JFw6Oe)EVi8J5sm$~onKg+1iMMe3h zzW674WA7sCQtX!`P$e;`Bqt`GJ#tuP@gt9U4^dIRLppDbcE7L4x)l2*2~dN7*e^+-Dvq6pUK0CvYRA%3sgk;hNv0Ew>d}ms0U@?|}rWBqk3{ z9Q?(oaN4{n-a}NB??tcw9!=W6$hwr0<6LtjP$e;`H1W%^1H&6Oyzf0kMfvW&-yczl z`-N4PVn6mk0#y=|N^)Z2^`bMv#YZ%t>%)kO@*N)h5sez^K5IF&F!oClsFIjek`og< zz0xtf__sFRLsXP+XR{%CF;!??iv5xVsw5_rG&HQ#M4m{@KpD z6#FF!R7p%K$%%=A>;9>@;GaI;LsXRS^{xJl_Isn9bt(2s5~z}xRFV@DO%8shB1&KG zJw!$MZv4i1Jm5SYsPan^sFIjek`og%zU)!4+Xq*A4^dIR1uy>r(8OBv2(W zsU#;Rike@&WY&29tTm#deC26LpXZe0Ndi?8lS&f@Ma!3bT>0zS%ii4(UABn#h{ji{ z`~B-UcC`B~>?$HaLSmOg72$t9`?GtxciQwM&sf$!{I~zy744a5b>`pE-ZKlWODQ?d z^*{nu5|c_3-<)!2*?sTuH{*$l^8N0MzoMVqrw3e${n!HuR7p%K$%%=hSKd=LdRN{v zAu7uE^bvnWMNbx5mtwypfhvhfB{?xMZ1~S*b8q8MfQpLpowvtd(SkP$txK_Al0cQj zq>`MNIAzfOnQ_1N2GH z#Gld84T`Kwv0suvmBgfyoS4|>Kc{B?yM9maAu7suN#UQ-J*DoKtxJnyza)VwiAg0n zF|lgvMVZ&X`lf=;m8dA+qAeSu@gs|@OR-;)K$XO#lAM^h_?i)!1Gn7mJw!$M;uR&w zlLV?HCY2_RePv?!*U|0#{CwSUTcWmZ54B6FdL6bz^Dl32T}sJu_CNwv5|c_31>LR+ z-(GZtuZO58-*@Y8i6;I~WL=8=*aHbvNlYrqiHWN&8W!Gm#iQOsRFrSgo13FMrWIM2 zV!tGTDv3!YIWbXS&kuJi-@xqw`3{`AIhy1?3*b`hmn2XnF{#kcttT$|Pk7mP4Se4f z73JGu%I4_Ho<-KBlpJRdBv2(WsWkEI;a$T6PCwXth>G$Z-F9-+tOA@G(m{gJz6ZWQE!# z)�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�JPFq?j)Wlo;-}D~m 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%0AX?`*y=PfJ(SY=7d1y|MD^d&?bd zHk9?2J8JWdKLWPU_~BZqI1RtrQ?WAS-eJeyTctIk8@#n^!K^>vmG#z6E7ix}$4dKx z6vtns%6PfdXUXsjhWp(58U94Ghp}?Wl|LP0QcHS2b=!Om;Qpv`-wx7B#c3fP<^x-w zEE-X^Nw7xX>~j>Xc++W)N-I_Cym4}O%_0#&XS)tOU=*$@4vW z+wRm0(ukU{hC2W?f4{u7hO_DfXI?<$&e+cu)G)})rMiQ?eF)gwUtaF0>4UxVqd57r zaL;`iHfQjTfEDB^=;uYl+iOyshR9+da5wSfKp+vc6HXeSb@iGbD5}=GQyRWV!oQFd zU+?O~zFd=J-@?^xajjoz#Ih+i-v*C#U7gZeTP;JWDom1@MyKxmr_q|-oe1`AEn(IWhD#OfDZAtKGL_j?(8Z5zKO-#c1PYL%Q-GYmc2h<@3W##t*x%aC>@RNAJFs(ar#45s$NBOg10EA!CE^i zE7n77a&(d(UQ*wir-@sY9ey8JcD){#MrV~@O!}&}+pZH`o+&!yrcT5AYD`wyp^mIQ z9|$hB<0TNF!}q5@ar0AEs$w<%kFxiUucG+=|2OpBdvDT_8p2JvOA>nT(wkIiB0VG! zRFEbhU3v%U0tq3P+|A}v1VN=r5h>EUA|2uTILXJ=>5 zIn&7yDzqZ0IKj_^9bA^W#Y#ia_d^sSv53`o<>~EGXk^}B?snf?Tcg$=i-#CoRi>KN z!?j%HP25~%*{Jg&0wpAZ(|F@#YAs6jaA|}gez8@&=TwP_d0M-F&rmw1w-=E~x9U-8 zpUbP??U&ZFQE^#>;iG~*>YcegMA79Fu^G|B19}?d3w#`&_9wSB2^D_9An2Ism{ljwaXJ&Y%6EyO$O{d+JSe4Qs$$?UqCslP%<-(#}D zX-%tJ>#{plxoh!L`t%c}qC10B?v!UT$6qOuzF$26_k+#*9O-M<<|-I zfS>qWDg;GcTtp<&{tXQj8qt8+3mZQ) zo*6iKS5t$lcx|~oL_1lr8PW2Z%if2pcu%Bh6%x`LS-O`GzLcSp(qB>3MK;VDte@4y zt5i2OrZ+}JR|qbguam)5ytdpPGU-^c8PTaTTm2RJSy2ziOQL=ojD2yy{Ylx6f>$@P z`b0@kuSUDkQlH3a%tj5n?A{#LI4Dzxeg;?ZzE&l!*uLlgWzDDyk8#{fGZT;3mHy^Q zA6>00J;~|s*vI655ul0SG-6+EANr=l4mzcOJE^3neN6jjDIs8k2u`Esb}Yaz&H6c| zpFXK%#K5)A=|WRLzy=YVMs`X&rXgnL;1C&aKq?ve(ELQsln}5%1gDkQjO4fpQppI8 z;eka{Lcj(QoW_{Jjxou#;aj(i{~(o&M9CapJ|zTf5W#8eR$#}I23|<1KEpm8eiGFt!UXJ&nFr(_BB;^cU>7d+og}Yu8f1FzpDgS$p~3r zqSQB5)bFU9;|)&82;gH|Yv9^qS}}sFWX!oQk*1>+6`#3jWrGtkLVj)Dq`I6&jz&gsm5iPDC2}6IqWjl2&1`T& zM*6?(>#56WP2&Vt$s7Q_#8W#_TqSd4_!2AZoE&GCk92ZEX7niV_NZkK&pFX}t1*JB zWUdcig5?%*azbV%Sv>SuT}~_6NSs_HGoJVo{eQEvs?^(+QRf67qi`D0nT+5nK6+6J zZH>qdqXmC4(U2Kva?VRq`dXRmh5oK#D}nz(;LSk2v)WVdwX)o36;IA_i_A7qy?K{C zl%H2-yrI8iw)TG!ps6IBhR>aqdnbBe>aUzK_s-T?^Fn35otb|OfbWNur-=TpX`k5n zeaii#!3)WXWTanY-k^|+^94cKfh=Mzh-Il0VmAJ*5;8jw<#FOP=6h@#%RqRmD0>pw z`2R-;8a0R#{`SoUm=!sx;bt zVT0}rmDp#OD!;U$5Y|1$Y0QnUo+9Sk>26>C(HWfAx?g#n#NSa5Yn1Un3ELj0QIAuf zQ0qpY*qTv)lKYgfL0=8o{yZs;={XmFhYjm%f)iXNj-m1;qB{)|HcpN@;^f4tSjz_W zSDZ$17{OKI7&d%~Nwdca8(-uc<>bV=6_yR^IXSIqoZu>P3>&@#`gUQ1-UggFz0k5j zZw5|_w?Q(&RpJ;ne2GChg$-@XqU{Ns=&{nWLGM9MBi@-2TqTZS!P3>&^g(1{Mh zMixD@!HHe@toxY8SDe-~PH>eth7Dh0T>B7V<81TF1}DmNwrtQik<-ZW%LuL#$FSi` z9PktqHddZ&WN^aVWZ9tcE~n9lF@meaF>Lq}7hgVi()F12qKCnW(b{S8oYT0S)9~10 z1Xqb;*zhGAPYIQRabZW(qUI z3;Z`kp;4;zQF_Ju+xPuBwXmD3b{0u8DY}2*cZ0l$OjV-v;ypi(PrW_Ao2zPtCz%x8 zKVa5CFXFF?QF^fw<>NoSmEZlSTaro9{X;4YP*j}8jBw{Dz3G;9@m+q&r4SvKCYco7 zUl?AKycLk`4cRGYty&fTrC)A0SCxxNGAX)$%7{6J&Nbp_YR=01Bf$)xE1 zqT72aDo$(K`884cf*jRdsea9*5DEVznH1e0qNz0YeEBj;|0TcX+8de8%~k2N1L6wO zOrctj%j=@_{lVMfKmIcWZ^#v}F}0h+cI4qkj{;RdNkVZL2d`#tUL@ zpGI!FQWVuj&)xEC`$eDF`_>%m3S#6$f7i6r7su;S^*RPG{kyh8jBRh46x~0t?DbE#wsdKW8E1< zV!H~#rz@(&uNh2}qWkB(R%v(wel=bn5ST7_)24x#^3{o;iHB6;>A6IcqWhay7_ZRC-dc9Nek9AJ zpov`?xVcI@nP>)K{o|i;-o(R_)xe$gr$m#Y`&-`kQZX9wA7>);7P&eG z)?U|4A+8@vG%33O3Oqr1o!~ieDnfryGdyt4FU{OsH3bAk_vd@-O@w_iUeDWTn5)a@ zVeVVMC7Kl7Z%naOc;nE0_4MaNlcM{Z8RKzZMfM)A_bD{Vm3>O6LM*tLXi{|l{Y)y2 zxT3}5_4J?bbWO+?;^wLf4-!p^?%(0GuZ?XFp8emC*Za=>(bf7*u>0zZM3bWXyT*>Q zYHO=Fjq7o8yng%EZP!1=>nOxWg-ny8`y0U%RJ2vHjcTXH>o1?*agEPd$IVsU%9|!d z_ZOW!#)}AkHC|uZG}Hdim)3G$Yhaob-G3>+{Y=>Balf5u zQgnawA@(zvTq;EO>m^!l**6c*Ial%CS*=IUWs#z1h|N{jhoHE9>J2!Jc{rCvm?cV! zo4yVe825w0$26h?=dO5zc6-K6@6kdaW@s>YM(4}960zkq0%Cc zNzwg78`*CFTg7R-4gQVNV;`mo{HmOvn-k~p{-EgoYuHs+wQ>Jpl)mPl!hwA+__?`i z#W0Ua(fy-#b@U?IoR89*L+RuD80t7*@8~~oZH=FK$1z({b5V{D{p|f1xY4F_t&k|7f)^K zUQzn3Pd^TtQ!A^Ydn>Jg_1d9P`sZIY4Vt_vhnuT-&AC0y`_zuo_w`E(?7TCd zI}b*a6y0BMu05KxOT}9q9w~uQ`ouNI0#h|tiM&BcCPnuTeyh@&cE3=R?p`-CaNMkd zZmz13Ey<+l{@$$yd)4FOyGZ@nn~Z@Uw<+Szi*YnX_eaQav|TDr<9qgXq+YGeYsY1m zO02(TniSn1iQVPZn(H?s^{v~!cD(tkn47B(#hE5W_dAw+?nN{|5~=@OaB7{=?vn1W z@eM%H{Tp7}-v)N6IIU@WPGFD5G{4q4dar~+ET3bV6y4wEyDz+K9NB60SAP{N{+lsraE!k8?K@Yf_&bj2?-;}VF9P)-g42k!Xc9-+ zzqR7eCK%!uTa`6xy|D4$C2!)Nrg0(5zrR+auon^5#VTRt7p_oFW8FDCF65tqmG&UI z-{7hxpTh?16}#+Btoqj~RgHfq7~)(|QAzlDIgOrS))euT+D99s5N#K15H>b^r_!4C zuNumK_=dY>0Dq<33Us_6bXjQL}J6smf0J43}W?r=J;?r-gVSZ&U(P)!@% z#;V8Yjjaq}9p|O8^OA6Tn$~?&ZDC_~x0(v^`2H4QuSxDWg~qN{Ac{YT*gXjZSJhj& zO|;dUjeUnt;;aQXl z^uqM9O1r^}wO3m`;`eqj(F1cBT*X_I+k@xX^ns$S8pob+-+a7FocHRmZOVE1b<(tv zGY0B2Htvm?{i8}u7`Ru^ts>ScGs5p&P84zQBE*6)@i)fHxgGtf-K^fc%4W9`p1Iumpr+RP| zzXodSI$?vZ$411V%NC`qJhDY86M}3vD|f>GMaZk^P2-!>wy{atK)WZa(4xsU#NQvG zb@!nB*OR6P)I`iaKkvCk>rIO8uQK3Ta?Pz$4F&P&*{y&vAh@bt&y6NU_a9k##fzXj z@#rGYUffrDkDNc4-Bu-pZ+iHrqT)2Nsem|Zy-y2)NOv?!&oQ~uzONgnQ;073 zrlRQn;m8)sY3z50`NXBC9sBfY>6~13x~Rvb=>GZ33wRN4*GK6kmcH9}WLzfaaeU)Y zbpK0aFyrUtH15D3qx4~qWA}|Nl~ExEJWMhvx_|E@mDaR}cO&&VYb&}g^eg7%Dwo?3 zHQ)JhHpQN%&5erEtL(|P|E`fuA?j>PGAX*hc>4TdoQ4NP!zg`v_j9g(`|>!sioS6u zy8j5W(5ghvMp62fKhL?|Y|G<(+&;;q=>Am~@+vA$YuZ?Ru`IZ-$#w3lf(lUvUq}?) ze;WDER2!=cN9os6ZFb%7Q_#s(HOeHJ6y4vsmNyalJW}7-eyVG6$)e7)_f7LT=3duK z%%hx_)0CqzQm=oZjjPAo5(=?+r)g4j|8K}prLdhzIDt^$Wt;>XWTlcM`8zs#l3csoys)VuZnBR<=M@=mV0iMdyb?$5c& zo2VHTsqZ*)A-=0t!8y6QX;O5*U!bbuG{%YDBlR>z*2n*SvXVmFFJPJ!-GAwEPOnmx z`ZQ9XSbS^zzCo3oTos$gG%32j#dUAuWwS{AyI#}cON^-E9P=vCe0M%E{J({&iqpu^ zSUXam-@0A=&*Q2p1kJ-zbbl#iS>-K_(Ne8Qy~dUn@%y$^b#hhC>xm{s_n&I-O*qO& z>cP#b#ebDl&3O?srWD=(sMdTnDM0O{?0{JTGR67iPSH) zP8I)XMhz!dMPTNZqWepw^Co5(D&ev6Z(Kr}6%17pYh6@iuVIvC0ZjGuSjKx<6}Y`{}YI7XKSHa0uXYtfhbpO8_y$Sz0QTnpZ`vPMhXK}uHmt<0OzpJYKmce=Htw!r@6y2Xq zD}c9J*N8~{vz#G8SM&Fry?S9uT z6{j^V>DNg8zzR>$J@mVrptW0y?!S(_llRL$(3WKwkhk>{#CjIV0I#{8gQ{fB(cyK|FFitZ2JV!vPQ z^Ku#0fIE~y1SYxT4 z!M!)>?!O^i#mCVq!AIewqUe4aZ3`8?AZZj%$1-0$=E7m4@$nV`y>I;+!U?iR(f!G# zvT3X4&%#>9okPvJO4JrAYAbFJt&5sdTV>t-#)qJ|{p8lQX+%il3Id33kl^Q}^GX%} z9^m#c-~R8gkRnEpJtJmM)I(ocv!~m#T~D6VrSG=c^mo|UjlUzy%^$4pHV`*yZskLe3b!G%t ziDRgIiCqtd3mdftZgg^DYt|T1+o{u@g>o9R+t)_ur>;zKtzNlQA@k2%mb` zG;+%NHxb0&Z;R+3E#4~X@n6*K(Cd}9i<+mJayL}`9R&RyjuUf*I zn@(HrX6T4T)*SNe9XCV8-%$_xJ3IkLR?_FhHI3<4NF{hHa9Y!T8eK{EpZ{O2)&-nO zTU9HGcEfpNa@|(!;TinGDwU_OO7IrtG~%|$q!;zrQm2#tN$?Niyboh;SY^laL1kC# zk$zZuefW}tF|H7mC|lo}Z$DL7r8TYKi1hl`!Lw@C2HVrCDKVXNKFBLxb^q***f=c)%2 zuquO^@95!8oL?wxXhBOpK%j&~a9YzAWoRu*r7eTk2%Xnf@t#v9&g507h_?^f&hnf+M8U)648F-yswq0a+3s75kV?WaC_(z{~kwe6+L`VH#aBdL|F92Hk}muJuwUfSJClw ztkC!pXY&maHZqnp6(ZVU+323TV<@Nb&1@4HKyVcupMwX!FR^M)Ct+jnopc5#R{UwL zZR-y^gmM}&aW)YPf~)BGL0dE2mna>t3mbXXR#1rU>-U-?v6^ufo`9Uj%=RJOSgO5? zNw+{Hx(>EVb?RRGP);Kg!YRwfy(tw8uA<{Nt&mB_hgh+=gecXht_>9;-OX5W{rl!_ zAIfRO*V@EL5L`vadJ8k$mk2uf(oJ_s(tnjpBpag>o8^NQ~erI{q868NNj8 ziH5KdIcSK%iF@y2%rqb#RBRW@Y4p35x45%*{?2i|-f)Guv(@^p^}zd+)5xmw^Fm>x z#`=*4SJ833CML4VdlQa=odwabM1(@PJI0u?jj<|os%{-R6 z;+WBi9T7@@55qD2UDLYNOy!!>Bhqmhd)IIxU93gF+@aE%Ht>EG5uJJcz(k#^=(r)y z>r12?{8|tVa!gQ&<{4tl+aOjf9TCcD{(q} zB|{Z*D7!$UcZD7rD0jUFF0)47U{w^lL3eTm}D9imiq)>Kmn|0v7GQ{(ecPQzQ0 z5nM&b(KXF*Ut(NCYtNTQvvTO17<<98(Q(JHP)=hm!zLbr;3_(v?J&cAiEfAbi+U6s zaNfy@?@L&3wI=YC(As~iETa{$)A9)D`} za0yqiUzzCPT5h-+a;I{a_~)OiMA7?}7o-2%FBDqSYCY1NWMjy)D4nb5__K>fxG$0S zoHd3U_&A$Vk7a}6%qWZi7S9_P%IgGg;@>A4)BGOCRMWF7M0|9dxfmn8-SDC3G**#e zqh{vOwT*|WjZq8Hx;;(!b@d44G{y`d-hDa8zgt?>1|R8h8uM3nJsRH07Q$6@EXSoP z@!N=I;%??yk#etXeXHtHd#E z_!5(E`w1Jb7IxJ+(P`yxq8|Ue*;AL(n#KvP634LNOJv*O67P>(9}m?zaV4W=hqTZ@*!p6pj<8)4>9`dWG$FdQzbvdnRoZu>P3>&`0z`PM+%&>p* zM4c1MkNqNSTwD@cm(v)RFoLVZF>Lq}ryCy-eMz&E6Le0jt8CeDc8jgcY0Q2wf~&+a zZ1@s>j%d-BeE<6xofE~sJ1*+cc7IG=PQ%}a5nLsXVZ)cGQ{$Agbj>s^IcXjv1DiHdQ*N0n&&irkMnHoL;@7}czMJ#gr%kFnwi^Q$! z+RsSTHk%va!*J|*^U&2eCZhR^=ArvCZZ>5OLgXWx?nn1-^n}0FG4;AWyUZO8%<%O& z+lKP-HNMq4R&{6Gp5Jwmb`IfVbt)C=L8am}-nHF2xc^F*JLXE;2t$8~?1?YPPL|eQffz6742weAiys z?0%dopR0b`;R+$z3MHhr;xzWDE@rr!b-S_q=7b>zS5?cr*_@AY;&EhkREa_h(;CBP zrHwz_tFy5`W`ilSw{A>r#jz9|*eLYt)9cObY0dDB;~L`%7EJrn{o}yYuAuEb6yj8q zO{Npy2EVsx7RqTvj0C=P-_ZSBEm!t1xQdrhC4To@rqU8;Ag`9oVT>`>}igmPuta3h-Dqu2#+nwlgerM zW%z$&+)MRSV92a+gR8zTx5gYZ7%{_zy$Mf3Sz~M3>hYE9h8aIWwQ*iz_-d)bT|)Kf zntu)M{6sv1;iyO3y=9DIC#J-I^}@1o6FzXsC9w&9Ce(asDI=y-Lj29R`l3{lIJ9+* zSrbve6=f^fG~R>TiW`?AGP@2GXk>5|wa;>R0#Y7XQS)RXOH5%SRk!x8fi;^N)b0*s zH~tgt&Q+YojPT-oM&EDOyUwLh&uu84X)x(5w`~qIy@gu@)U_1 zjOT;*i9&@wk)AfY0@TyV9EeHEe=Jp0`kM|W&#KZ7=n`>M-J_uGH^ z2K}|5hrw0!%%_2O8)aoB@W8;XT{;`>(E~hrWrUAK55QHN#=G`*W-(g& zrFRD(qHTKk5uzTPMsz=}2lefvaXsi4sS?)!Wv6>rB@U;`ZNx7N3~n*IwL*xiX=e!L zG%}^P%Wo{bkv90~*cR3mv{n4sRtXpS-IJNB#t%Zj%in7J8t^w9W>PE7cl-I}3{I0# zeGkq@-@fCp5&i@Ec248@_`~g5ld0l*AsqIa}{Tsqp4h>v8^eOLwUe!GV8ojxe~2zr$5x zO6Lq>lo7bOqt3?+uU8!w@7hXrHrD0i2V_sO2z4 zc1{vD{u;I7e-J_if>b_)eI|TC{@F*^C_QDI&WUVW;inJP%Xdo^TGP&5?Bk5i{MDZN zAh_!35#;1Rua=?9_g=(?^TLMK_d^715W#8eirDNkG2Z=g{zP5;Vygz{vt~c0W?B4U zLi->Ang~wAD{SXAF>Y@>1o8BAURyO|AiQ@_kHhnp{0~B?K#| zn)YU!l}Fg<;;)NeY}HRWRtOtUv;LG40yGhv#`r3-m8i#wS$TBvi>(@&xJ1|}z3DHA_MKrk^B7U(|MblU|w%^N|5&|?4oQ99r8f*S)UA}6cC_k?89kzg&nOZ+Ul2GPJ@qF_~>3GoW08#Cw>?jIB{2~Lh!E% zP9u-keqG0tsNG#v!FZW~?5!xt&=-!dMn7A}Vf!6n;_v9Y=Gcgx{B*&xQEr-T&!#nv6I>;Zq4FheKJgPa8qDcxa3b%0%SNxBjxbK6bs51`;uto3 ziJU83G-l8~t3K4=#G$vAjYnaQFis=)4kNfq9K(h$5woP5u<`WaID-?tbJY>oW@dFq z7^mSW%LuL#$FSi`X}r}K!ByfIHhhWfA4iM#x!?IQ1}82zw``1R*>3WsgRG4(6jtioZB(gu5Ic2J9^IN`Wsmz_ViFA}#-@2B53 zf;}`lnB~hNVfS%N#QjM{!j8Iw#SSG`CKdtF{Tn~=d@Mjz$Lb!~O%7%MJxAfNA-jV- zG&{H;sBjqlomSuJ@A!=Pq^h%HOn%qR0A!+JgeVo&9Hrtkd<}Yca2EM`L9I<~BXq7R zk~-K!vxBE5dK2ZlbP%OV+fF5jrujXx!D&R3&sr#mN!v#%Hr5OZ_R#EL*ek2uB#rsR zKQ=qNy~*o(+Ge;yh_*sKsI54S-5pC9&Wv5s)Yv*hN)z7ChoE^ssyU}M?Ljev zi0E5(&83RhTqRnC6w$*fZwX3ww22q1Dq!Rp0n${s(X}#})oIzi9uCEXe_k@UDlnz~2 zY511}ex%nbc{p&zG&nUeRW?_Mhh_&Wz4Rt_{7_cklvpdiU+XYEBUCgym|v=JmryDoK2XR-oCz zk+KzR8gnvRitGJ%XLf}YYNT@&wGYh>Cbx7lF?LH~{bH#OE_Yy4y(QY6W(U)w-Np5= zRh-7oK&$fU<;tyh6@1%5As!7yZ81A|H@iy1XQELFeNpBn@nx4c)VYe^ecT@QD~idg z+_QMP7#h3JpxgJuVp-Bh0yRi6!FSMByXSMjHa+r!KRo{yH*io}(}^TGQ> zp+cWX&!D(>?fwz_D7L!l>^!qvaEVKO6=E@-L7E*bFP}l1#%?#=Upl9H`UYiR&_m}c zdgf_%F!`BJCi<>Ps}H(vqiga4eX zQ7x=1Xsh_M&F#Sl2mS7(Oe(B?|4bX+YU9i-h+9Ni{tet z1%l7rvEH1L7=$+`%?{4To0HSX$o;6L^YDS7z(t!Qbgts>aFvMcltGMSu5IpU@Nvms z*cFl9)GrGJh4C>8@{9g20%a$H)5vDk{(zfmUV7+YL;PZ^He!cvvJqZAI3)yVA~=mb zEzb23HX^2sGsG{p>Oep2+zT7aPp60gO$4Wrudm%_VuZYT{zOCkVykKvwMI2V-=>HF zO$4W5W7jn?(hnap!4SXLs^3mpHYRUN5doSAP9wTM!?)s2+*n|=A%3w{5no#SrG9)p zC?y1FA~=m0#m_DY8@EpOGsG{p%301Dm*m+Lm=Xds5uDbv3_s--z0cx|tqt*uts1%C zvQa9PBP9fAA~>ySRkzm?HoooRZ-`%P)$I_cxUWLr)=milng~wgdW>%+Y*e0;#}L2R zs(&|HHePS8l@bCp5uAocWB-1_hJU%sZt;t)`u@3PqgcTjDIq`;!D&R3pRw|hJ^y2t zTl`|H7FN_nTh;DTH6;XSA~=mznbubHa>dSf6T~mJYNBr0$TPWeN(j(Ia9Y!9uCey! zxSg|0i1@`;?en*6e7vQ?hY9Te`T+to5uC% zf6KU+Re?@9+r1AGijK)c z{dXVY$3;a1k?*&O3Ndv=kca%+Lv!U0<22^T{NDz~e--JtitMf2M%{r{skA(~!#It- z;uEWgw_2)$6AiASWAbnJC32m8Er`|GCMd+q?m-^%Z!b_VcNnKN?a1=7&Q$dy9qSiH zD#X=xR;fNOnLCWrn1>5)Dc(_+cSjgpMaSgd?n~^xGutAzjZ%nfO@ch+-(I##?l4Yk zTKlnUoof=J91p(#LLpj*TBSN3lsk;m*fBldUSVT-u3-jO(J}eA`x0XtJ`%*)HoX-h zM^(#4zuvjSIIU?BjNmFdCjWL{Vr_IG@&1S}*395U)sKQa;X)GJ%^W+KRG*(O)!Buoj{_Va*Mo)iHk5;44 zyE*ajwKaNu&^=EWr{RZe6D>h-6&;g*yDt$KGFsSZonfXz%zhc@A^-M9$Oyz~O^bDo z*2`zSUF+(9GZdonGpkfxw&w}sG@e1-veE9@3^!NNG5NRq64{$r@ADen?5sfPr+&((&=~uG$o_Rt|6xzFC2-Z#yQl|j{Hqo8BGQ0(nK&@E zT#oDtQS$+aRpgDCKaA6eced+s8>RAAwMMQVvY`@vcUU8tuzXEJ=oj)gPgdcph>lm^ z3-nMNWd4AHsJXUlqMmB`_1OGBH53GWJCQ2w{Xh@JLFW6!o9MpNYTdqnG!7vZ5v1aT zD3yICWR!a##y;A$*ltcv?0js|4Y#N?b|tZi>may_jwue(muOyih`8H}WHuGz#0$$t zxz`25IIU^TY@#p-uA*a#gY+eKPZ47uE$(GHofB2f$6yhGn zB@_o4n7MEmr;$NMo~MTV)RN;LjNL4i2nYW9nGU@1=d|nNLQsx{5wPmaYBq4K~pRdrx9g3NsL~# zUlEDKRdg()k5q!a4MODmgQBS9+km2-L_d#fL&sQAeEF)rrjhx}eye48KEugv z$afz_hH=_@b8Z=ZlHQyOA>Y&#ea30571?j+PU&Ylxk|o~eTnKx)|lbixbq4j#}5=m z$7%TK+r(cWxJr&Je2KO8Nanzd96BfD$cdr>ISsEcoA7|(Dmg;(CDJvq#&BcSS5pW% z0;H%$P9t+9Be+VA^n8hrCs`xQR>hj>oRH&Biq7OTo?47vU+<_{3!_(skYitp0Od6H z)SF=0SX82!&Q)?$>`T;dV2#@=w(YGDa@0?eten=gFqx;$NZi3_C_g^T4{6eBQVNSz~^)KtID1Q4WovY-RkS~#1Zz+18 z#N81J@!I~nTZ8CjP9vM{qO#7@ny_!Z7BU+dS+vG5bHSm&wm><7O_j5kn1W`Do$hF zqgw~((Z+x7xr<07t|I?}Eby$L*d>*i{)y$C5YSE~h|T~X4YI*$#7)@V2@?>z#BHp{ z3f4BPU|olQJExH!?&44PG&v))@$hAg_V~}ft6mKvDYm<*&8R2I|>{6k=FP&$m_YJBtuZKd! zVP*8t6(hVQVwX6L{tBzFy^anDT8G#SuHq$BiH@e_oiHG*pAWGT^`M$_8oNPR-U%AK z6GY9Wiq~8v>TN5m-%Z!S)!ot5kgMJlQ6uLN$#<|lR>^B&m3*m)U3$E&xc>0l%&sAb z$LWQ2`MOw_UyP_7PVh4!5B=&=`oiV=-fQCcrGC}+^Rj`c;UB+(D8a2P%s?PV(@+bCACgr2WMm!Mzw zG&H!1+DAr-iFzaxZR-`$zw&GjT5+I>(FE=8fmcZ7O%1Ht+A2 zp%8MVx=mt3h1Rr>u^OIf^7g{TNY9|SckTWWYmk$!IM)qvyV~bc zd(jzq1{+}R^$=p0IE_0|d+AI&KDBGYjvfYANspxDXWq7lJa_Zc>LZS&jnDRJXCneV zKxX(SwMP%Y&&z2|n{(6hPH5PtgAcLog%!KRY3$Z)dnXjb^`Kv*ir?WXQL0QXJ+$9- zSGJGaD1`JiNxtT&hjq7KTA5F;Tz$Q3^4k{H6@=dksra+a?ZH<9-U(m)wBJz~u}l1| z#;<|s!C`~?d5rpgndi)YaE0r?0_uBkEBf}<@H|UE-_B|5H}QwtIl51(xH^bk;wt{` zQ;C(fcS0`2F3E2|dJpoFh_@X|WyLPNy5Q$LF?_A7z(ecJDYNHD&pe9y3(W5%2d|n9}?37Ug{xa;qN~>p0q)olalEe$F|K*gk7@ zN&6Un;o=utC0CTllRO0kXd*a`xNU2dOdC8sy&+eyNF~?O$Rj=l1Z)t&Y1pt<`?M`{ zlH777j#P3@kUaZSK)?nOoK9Y~q%}ylTu~&IT-&4wg%l95K?J9hS6{U*xw<6Cl~Gd3 zHCl?aNC5#GL~t4rZq_Pt^o~w0$2L!34F9tU3fiT)t4 z(xP?w5CI!Ra2h_4?JN(vaKzV2?>16NKRb%ZO#uNLL~t7OCAMGRKEw%2FFjI8??1{d zk^%xYh~PB#qAPFBI!`@ie{I{Ni7S}d-iw*-YRK@%M<1HDd`49#GFdu)Lxw*-{*W{2 zltqx!h=R!8S=_s4kwuWJ`L|<3g&1wG6;TFEP9x6*Be;r=WzI~MsCv{|U3xU9g24&721S`XIgNdO zupV`#CHImeX(z zVgy&o^;%!z&5sksTIy%V8YXZ;t{hVaT~1^69BaZwGM0~BccHOD@cBJXV?AnzWn)3k zrU_g{$8vU1B`#01VzA2H{Y00Z%hcn@cr41dr1n0X;3^rZrM!;xw|uFoLUOYu$>j#R}opcI3eTw zD32GX$=CTk!BsK>(3glWCSnw$e?)dMPRMvg%16d&P2&Vt$w)?DB5;|AwT!-kENPsO zahH@=jnkUO39gb6nZ88Q3K26J-LU#lof9&Cl=8!I8uOxz;3^qe>PwV+E@EG!yUyyW zb3(?!Ql2|bW2J!+TqPr9eTls%MGSBBof-9YPRMv(%Gbwf_-r$Rt7M$8FVWYEMUI}l zs)Ei58JA3X2RRMj4@Pj6j8XI@E`4FeK?db4q;r*weWVPCGOE$ahWLLG+#aW~x-?c~ zz|`(um|)0^z2qsm3K=lJhi7Kma=F7~j$isap25{uL()%s;>ZfmOiqa0mKfEL|0bsq ztN&CJLV3|A};XY$QG&)GDE004WBzJ zBWZN+zh}6)4Vkx;yuvtbWj*~R<4k{KJyi&qGnG8gIE|T9E3<0!FGXg$xk_eJ^(Fid zi+r!qQ~I1&2$}npJm@%$Ji?6NDw!45m#AZ9p^a`bJBPsunZuSm0XdDn#3q`8;3}Ej z)|W`#Oyu8LdfjBe4D9^A?l$C#Nx|Kf$uGtVA<|t7JxFU&61g$hjPSv}JFFkQtlFiW#P$W(ZH zHhrr_XWBl>;3}EL+Lw4%ucaV{!>gDRRqV{%`QW+CX{^MpDC^$8F4D0Cp39t&nZU_A zn$y^`c%#Vv9o;GW1cR$&#&2Ju+f$KYJo?WA6BXjJoyDBIyg7|IvYKz>$9`jZd2<`Q zx8pQo0s2{)(*5B{&Q-kUR0+zzOJBmr{?3*ldNO=9Qcp%%dZm{p{r$aXCgu1I+1aJ` z-yzu*g0l2V&rD7udKoqa=@etqmvBw^c*&fZRy5#8ORKsE z2Ylx!4IeK~$lUtmN5*Mn1#Ten>1)S}M(A86bLjgL2bYKpnA(P|BNd`0_649X;U4gZ z*|>}m8CS`@GJFX? zYi|xM=59KLkUM*j-z%qa(=vjq>XghNeqY=b{ zxO98oTu}*`37q;8PGi2^wlVi{ljMBiq>}lkZHU2%V!JIHloyB7n#KvP634LNOB{XBPK=Ph z>K|cnVtX$ucXY36jxbImJ0&ByN*u$6FY#~Y>>{oRUR4Gs^5wDeY=>8IgmGHaIKfro z7&d%~E>p6JzP-?wQ3fZ@9k6Wda5%y^O*6so39b^yu;EK21+EY_?u;2>aALtwD<^q) zdq)_j@s-L5t`f&o4Kcs=PW-XhvQaqJ5yok(u`q(G#4&965}_eZVdH4?N(LunZhgv<#c56B1Xsz7_`bv& zJ7<4F_Cf|%iJbiyGf;*enZMu4)?*XV-UPSDX^dVw&vX0#yWbI7X_QV`Pxrtdjgq9_0uVDE&0PywjPnU6a?jAp?s#~4`*fT*)v(> z^48Y=ZI4S(b{c=A>T6{rorRnOH2RRa2sAAmSx-y+@@>!{Wa|;*5}S}&NU2nu*0j2v zJGiGjtFk92a_?|eHRSRpe>lq4qY~LWid^1WH7|l_@`ocEoYpkwx7J9;g={_C#$U+y zO8#*5kkP*|q-DgH9t`4<}@fS86LxBdW2u;qF$vQLTf>S;JM7(VG0>C|i$8 zY(mD~PHP7SHt*6|mzjAfbBD~JOBpuSB9kxq!%Y*}dd~HK>E1r7Z_vQGJrtq=a(R*qs|ryJFr)A$^EpUYd+T&j4@ zRU&kIVWaVx_O9i1n(8t~H06+y+3+YL_cP>_CV#jBB3sX!O~sAGqnTYjiZs&GB9}M$ z!*xQQ8cy&t;rUou${2EFf4noczCuuzZt{nt966juPQd+Ti~;qh#8>?{T<0pvzDNFW zl&wc4`V1&%JiIzM@Z)Wv`un_m#lqr1kUv~eN#H54@|T#^KQac*{VA~Nca{zEZc8qS zt>Uz%Jr9zjL|Y}>*n`~B zv)gPB9E0pIT*dD`l{mOHtKna8>b~lZ_6l(YxxC3AjAl5^A;Axr#qU zD$x|Vyf;qS9Pk~U58fvV75YSa2F1N=_m3E5OuOPP7UFjG&Y||AZshVNf4Hpj8MJ9l z>;LA3JJbBsu1!08=v*c9_a{H|$wY}oX^n)|Y2(Wwk5_&40OSw%19|{nDo$%!!e3S{ z?-Knw_z>jjM)lw{R(P#k-r6Kw5Bf!__#LhibIRp1?v=mp+ES^FLdeYQ$=4k9uhxOWvo87a1*zf3pY(4y~#;<|sk70xQdAyx}o9B+&xx%%h zfchTXgT9^o;aZ_@=QQRrF1X#!Nw4>AnmI)0D*owLiMA!IlV}tN1%yB^Jb$HMXCs9>1bq zn9}?37Ug{xzJ%?Jq!o8NeF^(XtqqxzoK!M9I^|nR0RbCCa2nr(cK-HO$O0vEtCLD*d8fQl zDIj2j2u{OiBE6Nlem}BV$sF;dlG*Ah|5XYI*dT(_$m+P;%D}H9E0@fUPb!(GpYnL6 zfPf7mIIU?}+lZY6v~9>PCbRsLO71s6`N&d0zy=YVhS&XtK2Dl-?ujgEa<>9f$z2yH zuUZNS*dT(_$a~)IfUwa6+1}(n4WyDgMo@mZ6cDgM1gABvfxSaTZ)B~L`%RFF&vK=J zfDM`#<23w5Q~4X)78a=UI-S39X6#mTJVy5?(&Y@xq9NBkh<-=Yg>7EFRqPVvD4Y|| zc|b;gBTvNCxSg6xI0kLSJT+zS%%RX2`=s?3GZUB6_!~YdjCaTew+BC&%>G7&W?$AB z|F)JW)f9ZCB$vu2_?a+I?FSpbrjL7_-YS(OsOJMrn> zk70`wWFuVzX2Wi2>_3P$3T*#rz)F;gtN1lg+bXTqy3tob%6%qjU7oANN<3^>`IcTo z`B8^S{`b6yeLwCHd+_LMb15{kMxe&+o*oKVio1pCLAg5ug5tkn-6PWCp*Z_Pqv$r-x=X~ z>ZxVtb<(tjxE}fXrHX5X>%j?O0~t4yZ6sfhMD|d~6zd&+=w=SoVPajwC!k??^T*&CJ%NkZ6G&hub33|F>ua6Iv&*0m4;}OAA z#kv!<_%tdZ?RnGK*&0vOr|0s;HOgQUs4c1F^O%3$c*UO5`{=U2qLT0us-@b68lRnB zu1>A={t6+VD6+w6>@kA7WB=!u0{W)&*SShQk49#1q7v%SeSWRDc+^8aAF(YXtn=D+ zlK1q$p5xF~lW;vwl!c8{Dj}buWE(b(eF0F9Ce>VfHPnNvcw6z7*0l8Y^|*}dA@4ZK zWx-YQ4yC^%@&!cwvSt0xcoFhmdi%vFg@(^Io{ym68R9afw(3FiFv&H?Q$$yjw;NVv zP>-9N`qeptddNPJ2>C=&`>5ArEo{W=nd0if23N`Faf?3Ii}(~ao^{U|_Z793{Y-3m zG+HS;uM<4`aXkwArLLpndT>HMAIUb7uSaPRTDp?~2S9KYzs|g+v1(~wk6-N8rS~hf zJC%g88&m7j^?09Kgsx!gA2;p3;zjWG;WT<5)cpMVMs=Rx-sLK)6ZMbO3M!Es_1H7M zTHI;WgA=@UISs#XlxF@;SevU3`dNGSiN;F!IIabIy&hfjk&G-jZuRwd4(=H1R0kIRC4 zcflvYB5s%Nc3$??je+Zj`yMS0wGT0-Z30`(yCybCme81Hh^B?}_gs_1zL$ZzJ>#+vPo3%IA4ksH_ z5?jTuGq;ELIogQs_DyIr(e9`r^$b)J8Z%Jq(%;F0((0+{3KqTcx&I6N&k0^zPGe>Q z%3yOv?B^&IS5cj4%s@SZN?-(|H@{`nqW=|wwJxWTza7s<=S!vP%toIgYe=Jedgkfr zqA|RD2I)Hi<93{zYL3=b2x-ro*0d)!f&VQ6ZAB{iJkm&?+f#ZUL-syY5?(^JR1aWd z&6uaVX{5{v`9zToPQ%*}MD}^@1KjAbxk^5d^fjRpZP15=X1WuVwp?v8rk2Ry||x7O$!dF=0(VRiN?E}MkZ*Ks%!p(0bT8S(3l~)=6H(eYVvl2&mEqR-|pm! zqwgr$ClVo_C~6;J!=^Ru5$dtF@8Uh^;S8>l&m)cWRiY(`bOoNoF2WU*cQt)Y@Urtd zA=?{>13UcoqHk0P+505hNWLCasu5rHuk{S2;wpZfxjp#Y**(KC)LgVXYDn!)C803` zwJ!ag#thc=peq)Hj#@z_27(CgQ!yaQ zo3ML3syV0W3D>mCds^#@PUkYT=-Tgh&cU(VcPAj!@&51HkZz8IBC9*-=dxxt_%8*& zc6e%HHJp3`{GuJ67DtWnoCRnPp5Q}S;{X1yl|JEIZiOIw(gvq7LS7Q-D4M^wexp2m zK$vPNY!tv6{RXVjt3(KhRL^_iyFevIPjz?Lm8A;N?^}mwHi$zukxXle zAz2*_QVq~=_dn_(x_Oz$DJM2HHkJL9+|6U=Az{Wk;xIV-xRWgm+WP+>xwLyC6 zM~B>8#cR&n5V88@vO5xwPt-eiFOl%&GKc49_@N$MSU}WP=KkEc+TqEDzrRKvP<-Q* zpW^!bT9kgSd1^N&YAkYidZK+U`&;cMX{>pb&J?#V-9-J@k-HMSRmm-i)_qUBEE^Xv z>DD+sOUdqTPIzCNWLj&AdX)HSqTaD^g#@ahJl7kP-4A8|=vn?SwI1tgf3q(ZrTS;o zt`JVpF`bt(t8yB97FQYO8v4UTJ?-Pxf{?0}8y%hutBvq}?ecpO)vn^FcVFmN^R0G1 z-R1BM-eiP-TrgkqeMPxnSMGIq*5GOm#j&RCtp17XLalLnmsX!CMB{A^&v}%pYK%(5 ztGHE~_;L-$==s0=+Uc#5C8Rn@FJ|mf)p~-%Juyljd?cGfEZpkwM8n2I)SR~h-chY4 zI3A6S(%VeW?&K<7bCsx#nzw%Qg}$!RYA3h8GS1;Kw;SPoqP=V0MXMSA!f$|HcHlXM zAlkaa^Mr9)(_SqMarKP(Om`1HCJ3ntaXUPxV~y}z_q>T4@%J68@;20aJuac&{mJ23 z^)q_p^N6B>jREj4DS-%u&yP7gvv8bu5=GaH*j?V0?#Fie#Ie~FVw=a|8J&o`9Wf@H z#@En*{_*G0i_SfrOZQgE5~{>6o?jd#xA)Y0^nL2&M9(CLr#yPN)rfrItpGoL5T!Qs z)VF>4)X7!6<|=U#HUBqXL*4xlaki|skB&P$9nKlyo4a_|{M@{0@f|R3_!{pKPSCM@ zt8rS>{C>&d3fLK-2eqsr2&vk5(&72yrV-xuR<1CW$Q+!?wc<=JT|;}dIq&e)#@Fw! z^>c~ZN}BA^=$zhH_<~H@7`WXmsc#(AKq1bzIH%!tfA>*ff!n2=dP1Ziq{?%{;RyoqRY`Bc z55(z5rJN7V)(r@Im0-O{0v)O#h07BD`W`zcU}@Ymg^s!#wx(`8;)6n zPXy1qYY|da7B*60_G5}4T9?_wGx%*x{MzVU3DaQX%bN~Q`W3hva@g0vUSlD9a%BV2 z7xhHv}VuI*#%*?xM#;hFw2F???^Ji%HJh^rO< zcDFyN5;v|mJloGDhWDSV(#XE|#f|umz0bMniSkw@*OuDKwugw9C7T1|%5HKWI5u1% zy5iX$f|-!EpIbJPX{`VVPt{HC>OT+Hxyrkx-xEhm-HLC75jcI>Q;##Npeg!6x*l?+ zfsV=VmEJyxWBDz6pmT9qqifGFh3JbO?hNJ`wyd*yxMW(3E0H~L`o zds^91>GvmfDr?-C8>SFte|LD6Wi-PxL|8VGX>H}zyYV0S=P}CfZ>4jUa@Ca9ol{_Y zz>}+OjnZ4Q>wWMhdjntK40w~BIqL8nsEYjUKUnWw%SRY*IBh`p1@Y#Ot&QjBa_Qcx zK4v_<+?zB^gde~*G zKJvG(dy0`BU2~h(G`;Ap_#6$#7@07J^Hx!oRT?L%#2=}?3+ys;m{E7Z9)(zf(PRz~ zeU@27GOZ=7o)h>Y-2h`@+jCBDRdS1>RPTw9#YwKZgN7OY&KQLlydPJysTsbcuw^5e z*6J_Y5wP@!PmLXA?mD@OUw^6xBR(k_STfy21%HJ*kHo{)oOac>Ca3>q(ha zsdbHJHTFOFW1^7|_hvsQ%C2>I9)TWv+Kbk9yw2p>(R8BG+FTUERmxT4_OzQDO9p1d z^|+1iK`IHg34H?&!IxJUj@#Q`cXS1<@4=XW06d5Cl3UQH~lyf@o+v%lLT*F1CQkgANVGLz{Vqf6$Qlr)@opSKe?^DUR6GFSK~M477de|~H2-+rI9_j`_W&gT>Bv-k7e zzcmlfUTeR>glMG~=kAuH+Lmwp>6q};kJqo(RywDVBe9;@_q*=ZYaTu>oY-Qs5NrLH zyB6$PA8Yb=db)D~@C~3vxt;y+GhBCjWw>bbzgZtZdLKg(-k zf~4aE>AOx8KLd!EHXU|Ydr<$4hlK-=UXV{(vBvns4=Jiu6a!_sO zqYAk~;8yf8ZLXWOYxx^({u!P){jR*W^6HYrsz^vy1uw~H(0cMwA=J@_V|VPc!TjTX~oj?iRt~%nK^O%F5#VR5A}$$Pb7w06>>Kn z<1}L0tekhljK5vAU)Xt2d8n|B>$GTU#-jQ;Hh=R3VQDtzSF?zL4izZxLB;I)-Uqw1QC`#g}}Xvd2^;;_@Y7oY2C zfEXb&nOoN%7ACE92^M3u^NH`zc;CE{AGh^zkGTKR?zJ7|9K(?~#~>Op4GFWwFU#|p zABKk7$}4A&c<;?&GcLGtQe~O+K-(VNy|&8*GH+WGJ=e~6T^RFun{QTQS>KH-GtygY z;{SR{O;ki2w!}W8CsjWy8c8dbjZFt>vt#WJGuwolR8Npobee$P`{Rl+jA^T}c-gAz z#T~D-v7(h%YLfCIF?q?kGftE>&VQwrOqDX9ASWNTjLJMttq@o(xmp5||J^VsGvkX< z9svza#9CGEeKZei$cGd7>UZ#G<8?h(DD_gS?f%zYd6 zKBQ&*xV>r`-g}{kOIpRLReCm3X6`rpWV4GZJYwoc-HZ8?%Buq_+GK0r=@)9NWKPF= z5D6lmes(>xsDSw5d-Djx8-=gcAHVwb__}!2&OE5{y@!v>R<+nHtM457S#1G6{aX3% z{YGYX0Y3f7|2{%?4xF*?7Ujdlr(gN;)*hiXG%a7cz3}pB$F&)n?Xm5T8EtjY!rB6S z`e!sdy2>a16k^KiA=&>-^ocWO))wH?-$}l{r)gt8Iju#-Vp#=uyk=}>!id@eeER>K zbi7SDe4(ey*WREFA8Bv-ZkTvj`nH(1SbX~1elgx7KK@s20Y3dNBZ9Osw|=nsv@-GO zA2e)1CTYdog+`GuOOEYvRprImkv;GCh`sNvEx@OL-k~m5q-Es1?8=Jk#i!qO#TyxI zrBkl+Q2O;fTTX*d|BFHGDovZ(0(|=adu*UhE&Sr^>Q1Rzv~pGfKK&MEu%vu>`Slg| zExIDR@p>C%H1THd+QM0qKgUV_K!da~&pz?g)X1k_nY3b#`b4i+pP9O~`1EV{9F);S zvTR5j^YR`or*#mY{;F1;D)qDW`EgbOKK)^P3{IqDMCJ7dy(a#c9{-$FtqFwj+*cNz zR;6h+?eQN1=O zZz&$N_htQ&v|tqe`@Cg$~#N@IB?hkj{uDtzOL@vDoq=6 z)&rFlSBp=-j-SRs8*?WC!C9RlR#EN<{My-8fdY3oW&we)gB#&6y zx=?^me|%@BL0Z1*D8x+h>4%q{6l$wvP8W&oCFOl*jnBNk_##_^RA05ArU0M*;hio^ zr2ND6ek(sE7@O%W9uOU0gfaibo;yv;`@#2qnEuXByJZ&6yxbDBGV^K*6+)~WRf>4^ z|8~o?uJ(y7=F}A6(?4Rl>`7F#oJD@=kMirTnN)d!tPONb5XK4u`x8Cd1i7Wt$}@9& zJoud>X!Z3QH3j(eKmR>R48DI#`TAofRo^NatKP0Dz^8v$c$qC{($K@&!0nn`(dWqW z?>B#>dXug`ah+(ur@!4gpO)VZmsovy%-kOLNvyP$j+IW6oGiZ4R6KUg*!(@qTp3L+ozA=5)PCw-be>5cQxMQIJpZ=lyMD_JY*R}`lSt!7#zw@;tB~~+pSi9#> z`33WQ;)~yE3h?Ql{OTx|(-AG-D(#2N~cP{XV zPT$uQ;M0FGkANj6)%d&04?`IwvYAao8e(s+B z;ZIY~Uh9_sWX^@s(lS14tKK%{q{uXMhWZ4vnW}kmL z{RZ*rzkT4b`Qv1U1fTv+3)~C|-dfBP_n0!P0H6MK7o95U0P(E&^wZdD_Rx1+R{oo`*jkyxC9UAC!@SMbl1R^(Z`ZqH`cF5H2uIvI*(1tiHVL2p zuyKwcZOnU*+&+Cj@jyN<9>}B>a}*jy;`x8is+b@?{i+^QJmRG`vkLI(-*d+~i4wf- zUx#%4X3DAIN56cV*H*gx{SrLpgq^3immajw)03*JWt{<^ex7j{_md+}`r@!+HJ}vFz&rK^{7N5TS9ACAz(xs;LfCs%A=dC z2XO~^f;HeXvbuv$|Izc@$_pjv)`Qn|-=X3j@#*ho?#kSDVr>CF{pVMo5T^rHnl|Q? z71vEaT73GCZPmsjM$0-1zW06|Px5H_-s^<0Kdy~ddU5VPe`(w48;MW7llb({-289W2f#Zv?vYjJhyPQ6Pygl94wEv+ z->c52?-5!<)5gr5XUgAnKK*Rc3bh@+44>G!?b>Olh)@5gvp>sdqP6%L;M2c%y`wEb zTGnbitew_fTGVq#FUTaVSYx13Br2adz5HhJ>3?_Aryj9ld~E?f{Xf*vujezZPk z+R5^6`zBdYB&~G$Q%_2;^Eo|!nXpUv(@uwa#E^a8EWoEf?|G*|T3Xb+8!BqWr$2FE zc~)ELx`dP$3FKAfwPW+u;`_lJ%vkWNZ(n|G~PLN2#(SC?|876evHu9iUMi0cPs=6x~BBcP!PhT~XOB39ZenbSq$`{M>y z%o(yE(_d=I>hgCA@agX>zsaa$V)JTC*Z!Tx4P$3#2AwwCBT&Z}cTGFue868Q8#*v0iFSZAUqf(BOiuJ?h;XX4Y}^~nJq zVQZoyNV{0&olifjt&+Lm6P@m=%>LZ`Z`uEokp({e)u$e2V?r;t_Fo%w%PF^2JR?5+ zeb$zH#0Jv)z^6apIoJD;HfGs_RR>8Am%UMXxTF5e(3!?NI zCZ1Un=5o`V2I(}Rtx(SPY=&qwk`T|`9pksK=^&lfFv=-ktGvjpk12Kp;np&!Kl0%$ajK#w}JcY8~aPHSi@ z%tf$!0~(DZFf#mOuG1i$*3edNZs;_cLO2c5X$^PBSz)HfbTp25VOB96q&oc~Gl7!XJ#Q!cS z#O;H0T0>i5ea3cPlCT<@==6l_l#SXs>9mHn!kQdk8%8;mB&>!eZhc1x<7y)5w1&3A znwj4M@hnJXkxEF3i0?sI<29txPQ~;m3XF7Go z2s0}l;Yi0C0YZ3|_}OAB#DwE{iU5!zpvUo?H0;`VY?AQ$zq38Xh4%Q9N&tXxRB0=zVB~evs=A>cvEW5HvJ_ z{*mhs(lLR6CA1a#bNdAWc~Xi9N)hPixsDC^r|w&c5pBBFw%^(@sMZwCes+t^q>M35N&CIbr==gxLpc+G&8OhzMFuyFb?e z@saF)Xm!O{t3d)99DOwHG(J=Wt-`Bv4G`GN@aMQmmHN2|a}?FI)6fL1HatseVl?ii zh~RwDIP$hh)%v;A!LEZ4p<#_q)SI>VyUG3zRSnv^>YzMzG3d8X{WJ75wtqG zyDN{<#1`uf3m3{hGW}eHU5#nmOVduHg%FD)f>!_AmG!C=@ut+>*JO{EelEhO`Iw7p z+G)%YVroRtYRnd{eUv78NQ-(F-{erwMHnp@Yfeo&jS3;2i3nP){Igg6gjp(mNtNsz zc=h{UwvXa^fHd^bkKwxf^5VGdW;U;B9v(Y;fJY4drI+omM*PpMgh|_2nVshE6wYYf zKh#z_Rys{C9Vg41@ODz}xP$QntHyU0^@_u|jy@kNR%5!n+h*p;>jvgeS~@Dc{Igzm zlsWodx4NU1rd_PoUv+=}*WEAni0)tYil6IifZ0Rd$~+|dOOjU1AD_6Q-HtOa%goNd zK4Q2>{JyN09dY*gJX+DmxeJZY&R(9cYjtXFW)P@L(+<6gOrn&e7dCV z%um*JsXjXI6Nn*Z9E>4pr}6J+Hq0OV{uMSIw9=&pjUw^>eGkp}Lf+4}m-qB2^M~5V z+l8pinOYF^SU8QpJw7lqc!jGaB%q-Qh8^+T6B}mEkXUJ}WKI`}doCG2<3@Qavr_sK zl;G6G;@^wPnK7|>75QqM#uq=-X1ZQ8+#^uOG{LYVHdu9k26b0kC3C?ef}!%|p|SF% zCXA`tBdo*pMq7=bgS^9OIlq-hV6@b}UeZ31w5p$2y1}sQQzy&G6!lz;mfF`#+G#8k z;u#^5R`nCh4;h&~{^qeBfw52fdPzGC5=pE2iPvRz{LuN6DmCFo%c8HBw9}X!5lJiU z9rg$VV&(ahsx^Vp5?1sGleQX`_(_PQRsF;o$*aXTjm>KUqowxTl6D$vh4@s6q*eXI z8Y#j4Cok{_jF#HhOWJAtDMUXZl2-K-Yh-qO==@fpCNNrRUoUB=K_Y2YKhaTIR6)Mu zr3s8`+Sg0kX^==-)lcj=f2ZtB896n9Q8bkI1{`Zi8?)oE`({j%`Sc1I&y!Z#J6t3X zuQ4|_&+hW=0FSUEj`AmycIl8YDuXdfTP1tDBC%)1pc!9Dtjc6Z3RWhFJJvPm2N4r` z4M1Ss?lfe@lEsQe6IgR-f?-Rvfvf4_g$tRxp<@gz&T{|{&sH}vs;>8$+^)jp& z6NEA1xb-~$E%W8sQ7b{r_XRs31Rys{u&l2XV7rIo-oFRMGud;%$^91c% z*sPcK4LA)UFw5`=SYeJrp97y{%tK2D%-DYPq{<^BKZCYnYHeOc+Adb#P24bZZRE=! z0pEfq7N9q?6b4i2XlX7(u;%D77477 z%AOhE(Ri}2p{?LU#Lh#l7ZV8BSZM+)q@H&lVF}V{LR-Oyi2ZQTND%=wG=UXTU0okb zkWOo8EBFwx`wto^BG%9ZR!HY`tg-~@w1&2V4-tDxY+glrF%fHM0;`k{%PTBFIwlaX zxvQ<9mHn zf)5e9w4jk9Vhv4T=KcKi&XypZ*3ee2ZRbi8u||?uQ@5WbNT)S$hgRGVW%J7R3^}{= zERnm4KyScwkWOo8E49M~eoz~D+*!94Ew{Zk!tn7D5 zr!}+{c5iU}XdHo=H^&dsX$@_KJtZ7{8cCQUK{~C0b%uT}PC?i<80j@kAck{}9cBr{ z3Ur##R>&Wmf`CTj2;_A2+2>n=bXr4Op`39N1saVbP-E8BjkE;mw1&1qeZ@H+Xf%#M z&A;=LD=k4ft)Z>Z?(Fy5MWb;9TJW7iueKVb(;C_e{fGThx@a_#s0nk6=8Ux(q|+Mc zuV{sS(0*ZFG#W>sM;&?VbykCPT0>i*KexXNAR3J$Ffu$f@p`L4I<29tFkabTL=cU} z6Lob?gLGQMjgZa?BQn#`I0EA?(?QzP2vA4073K*nkCKF)EolPt2bKqEPs0-03iBP- ztCEC`l}E_Ti8Y3FS_88sT4CPC_ED0s8k)ciknMwXT0>i5#>#eHlCT<@z`T_0oOD`4 zTVWo}{;DKlH8g?wHTx^lX$@_K^#J?bl7!XJ1l9@ccS)x;v=!D-96w4DRznk5?{NGe zoz~D+JRgNRU6QaG9--E4q@iJgXPrkl+b!SQt}{8COM=*>ih+LtRK$KGE&6_n0ypL((o*SBgJz2l1+Dt7O>}iQ4Z*%-FWo z0hLQ@#@JfIJh^$QlxDQj^V=X)wiz?2@)XAsz*f{j0tG2aW(BU9(M1%tVV1l{Yo5GdXBjH;eq*yYG)04ACx9` z)}Z`R=A`8p^3Go|y++=pu2ws1*k5sVuW6?twIq*Pg1FNP<PI^E1-Sih^XN|l|^)zfwN1hN(yI2MCX0)~1S%Y=0ttIsm?QUxxzOQ!H zfIxf1&Kk5@P0Ojqt(Ht*AaBF}Chxs;Oc16INYgG>(#}J)b8UroUO#c7yraKW?X2Mn zo1Q66I}H%GsGT)fFQXr45x{;vQK6=wX=pRY>dFd>Wq@f5}wO`by zmf;i;jBrG}7l*5D&QUaNH7wCS+Py=oVYMzDm@TD=&n2(kPgOWNxv!?3h9+qB zVBlI5X5nd~jkLix)m|LV)j5aPwA0vG5wvPK!u1STO{56ZUEWx3BJb|z4VIdrRxG5E zCSI2>*IzYY#*#;xhv$AWz$3<->3X=uPhDfjTGBRF=3VKpew8C^$!#gL=xOLXR{NUxI!uyZzW5=b(_jRjOT4~zFs^Io= zdc?8E^@*SBYk>J<@Pho;vKJ?5#r*M!?64DNY_s|7{O^|!_lRvz>SM>K6Kbw?^O7jn zU9A2+YH#jjAWR zR8Ew=IGV^GF6A%t5)uqMV#$@0svi=Kq!r5sDK8R(?>%Y8MYUb3_ZJOKKo2t+#*nnr zh~_0WRE z0Ulv{QALn;>5zUmgML?A>GqgxwSoQ3Nw6E6TMForv0D{k_z-dK&R!SaBF@Lbu6_bz z6n2$rI!$OR_(E}hu<-GSssle(4(?ENT)Tl72Xw~oRPbYB%~&?#*j{HppMcC?>ul05*m#o&?c~F8wBaJ zhPJ}H8=Qk|Jb~T-JIO(iPHSi@yo16y$i@@s)o>0H1nIPfw!*tKoP%sUf!-NA`$3RS zYiKLH6U4d1#uFH2uxk9mHn!rM@s?r#ENiUjFcBR~kx;+{=D7v~`D^++!!5J(Y- zAnKUzrZ-;mLli z+#N??q-HuudqjX(X)DZ2SRN$_n+{E2#=-I+?P*v-TjAX%>s3j@#>yjP=ENF9I<0~E z6|L}YlkKA9mHn!n;kj^OA(s&;&d>Z0DrY8rll)Ht}5?lv7EOdPHSi@yxZjXQIfD4nt-Q};|J-qhPLAQe4AI1 zo<~>>kC1n%963pQgu%1m3#Aoe!tuOu1oSwblTK@BE94L7C5Z?l|9V9D(-8`7Y_ShPFcg!FhWl3ANHA z4GsBjzw8SiEBnHG+&Q?wec`BM92s_gZg3oy-xygspn`kPlZ5W)Nn444JIVEP%jOR* zaL>N4QS;0372Mgc34}Q&YT9YQw=_xK#A&Ogt%fu}aA&_JRt_3c;Q0nk%NMOTIH^L; zxMwbvH*uOknDYlsyI9E?cY6v#Tji$@X@KA<2u+OZIJCgCAeuI&YsH|7FQXG9nn0NI zAWgeijS*kQ{&HeOTU|e4XamF$@t5FCoF)+Fd`{C&gQw`URlljHHb8I(geDN?yj0Up zqkVMlPFsy%b6Nw$67gT*6rCmz=KNaIP6Oxeo{k7w-Fw;@4G=sNr=N>3*9n?-8k(S0 z`>)SzfPe=Qr|9%^5#|a>(@x_JMbK*Yh_mV^;!||`xzxk>p=qmO{h~N`r>#!^^K6@r z(gaV@X#!#7G{z52I}H#xMW?NP8a=!rLP`*)=rn<_t5E|Mh_JQ$3(@{DUL91Q%9MJ&5GjaO42&0{2{Lr-1&;+fTRh{1ev6I{H6Ta2q z0^3K?i$fZE^zO(B?5DTuF>z*d*&{Q+BmS6nzU{AY?oP+h#R@0&aK>F*=~$(S-m>54 zQ+Z>8I~ZBuNjv9&3*#`ZV`Ok=+_x^Y>9PKXgEH%uj0%t0+p%+A!v8Fx)w5?o+M9GrayLE342F8h6q z_;!22kiAh*x8>oymrztm}b;m)gh#IMI*7=3xz zrya4I{9@t1<-J9wx`?OUur;9|_OU75+ zAiH;dmNV`sLG1BiIWs0UucFzRi z?nqmW;5^azyAVmM`U!r4MiUq<^}3C;)4&&K?v-6HNvrw^d`|{npwR?IOTBI*?KJq! znxs|z#DApj;tMpIz-X!0ZKRzBzCZ&aX;nYLFVJWLqnci~k#-s+l2-K-t)s8QXab`s zcIk1fC2h>E{qC!{Qg-P*H|Z!l)@m#L=C4Q~UaQ7655HSFz$5I4qgRl+zY1iG%43Yu zR=V% z8&bpz^7FukX~zm%-=4x1b4z zU91L1U*FSKI^UAH>wC7*p0UFeR`4g`tR=$m`|uZBV#50RG=UxmJ3%##SjB|(^=T{k z#cjXhMt)Z=WN~B)GYIsC+#smcE zvCT2S<9vo*k=iXbXvoC zft?lJJ2D-OBe0@lI!LEAv=!dCvOF3`z*E5TAf49GR(NyFdeulm-Vd|JkWOo0*zY!u zfIpG_F6p#}w&K}&)b_>^@Z56zAf49GR@mu+(+bdNBw>mK=~yE`$hJ;ph39fSPZ0o8 z1Y*eXoHXq0yd*#f8rll^!+A-H0FWY()0~%(hMhn6(N-vD&aYBL02Z;*1ZoWDSEOO* zYiKLfSIpb+q!bZ=#T`wc=5q!}8g{;hwnDqZw?*)z6cK>M9ZjGGrlZKtIp{>w= z;2S9=i2y9_c!cysIP-<;q+#c4pueIO`ayi_r6du6wRaSO9u=qEaGf;ld<|`d{v6-l zDM86-H#Hqj3aAYNms< zrx8G1TVZCw@+e8zbZ7!I4weULPs0-03Ns|utCEC`l}E_Ti8Y3FS_AVdT4AQg_ED0s z8k)ciknMwXT0>iLeTF6s^1Z20ED%m#82Y0O7^**7LQm4fGz&`)w2Jk6nr_a4|QCN%8` zIf<0PNu;C|Q|l9(4?Cfv_2#oPzsX4?O%(pVmwjV`6DlA`JBs=>R zoKoARva_7|!LyhryLH$*YTMUWrAx3<&MrMJ-c(K4m{|YC^;Md7vFi0?m+D6%4c7y> z=fX>Yn&A^$ezCCpLpi&2U8F$*8l1x;R-~N<-%V&Mlv@47O>#o|QF;HN36v)MOelX% z%jtv@7M4FDC)^fAZ{qk|&|JM}+QkaqD4hAxRw&K-3BLc(1WFS=Ih47kjp=s4C*^W> zDUY*Dnn0NAHciL1#GY5vR<@QzE4?)F$8F8SL&Ptt3A91@FVO}yZA|Ue3(EJF_rbr2 z?^P2BbH%D@7b~1N#2FK9wNJ}V4G=szsR@L+^47G|&;+f{UcE;H1W$nK=ORoGf~K8D zbVAyugH}7dyn6!#&%WyCB1}(+rk#c+Xw{}~#|DVcAqEZvo!@OP7P9r)YZ3%kS{ywRlO-DV1 zob*0N&fV$fZfn{Vc$!?(#yl|Z^>Usj*95{S8_e`I?P66SC)S^o6YJV)gHgLRK;Tq7 z&e3ZEVbn3q^fm1?q7%}Vpw*Y}xtds-h-!OQKNn%n05t71G(oE$rtQ@L!LJnP=OWA* zho+qdzl5NzmhQA~0|b7ppr`DQ`r9X+Z9mBQ6*cfA&Z3N&wB68(OWtfAwl56uh?TeR zXL~q&143)NSn-Pv+DgYNO}r;x*x0JiNSnKyi$2z-%$vz_{%Fj;Yll}n)M`+E@v>3b zt?xU)j!XD*2cAnSO}kj}n;e>``K(J!Xxb6-<(B+pdGnLBV*dEVu15~5*!1w(d3?D= z6Fpb$Z^tNn#RCLsr!hv}lHtoO+A3K#MPkKiKbEg2-(k5*-hbRbyv)uZ@g)`eT(z>` zy2NS7cUUU%9TrU-dwrRm$#5;gb%`VL@*S4DMI&j&veA07+i=B*icMP`P`ymPC!-1I zT`Dsf#*nnr;Fnvpl`b`C6p3q3T2cPA?Dv^0-(f)sVvi`xoT&xDRiD#{PDpzMG&I4m zBcgeGR$J+OgGQ04e(<~U=VbRMzQckN#2!(WGh<@&Dq8P4jgj(e1%0m>?h&Xlnqb%w z*oB1e$!M!&F8Bn_@ZK)_6VWee&x8)sE8;Y`&r%cUakS5Yv`-|h>L+s1m!>pCe`QrNq z-wyBy+iDd-+NDFsITPa@N~Z>+$^l-vdZm@v8yoOG*-zn!qd!R`k}A_B1M!R`nD3 z+5%>Mn!vn`UszzQpl8er{og3Z_xf7N_xh4n>~VYo@j6Jp*LRM5uTK-0w`qc5mkxe? zPh07}3mTdz`r%A)VDWd(CH&J}VQ$46^1BHVhIbHW*Pu~90beLihJlFb6rru)p~X3` zl0*PC+=2HDr`iy1IlK_Z3LY=32ebIxU6O!*&&FNTDMDMtac?x?d=7E~P>7gLX=tlB zM;j&{b|-!D+*b4RGH>7BYT&&A&SQy0G35cQkSF$Q1QH&3jLh`Mw6_HE5GUkgB0wlf zz`uv{IJh3uFhlMJ^3M`@7mpKXu+rtRVo$eY&zgDVp$T`EXd9o#gFOxS4RJazsS(p8 zAZBBw38aJdDvlw{yjW?gxGw25r3k!(V65VD79y_44H9@ug42LVQ%t7_ZKcb+aRlD> zuxw&FrJ=3jx+JkGNd$;*d|FPzaXCvkb;2zWF01+dxW;an;6@QBpvk=sEJlxtm0NA;kb2C zBS8F+yP9w{d?#B=Vj5;%UTLd1f3zM6C|C_mAa`*_5!x{gGp5`U+A1#R1_{(9`#a8J z71t#R<6WxlyR=3CbxojFGFCCI2^%YI6_t@&YZt5!O5HFFWLlY84O|%-Ch6G}jwXsrGh*kZBlt-53QB>FEtYT|5N)i&2 zxP3(0w$~P-`0Fa`nML+pBl>oPS^fyeePx3L=RulAq5AY|if-`BOZ<-xuS*GZ=dZKYG5B7j;A z_O<%C2&Zy4C`GW>)->#Fna6~-Vm)q{;P?S6P4G#v1_Cx6n&1eh=`^9OI9iq@0%~v_ z1uOOp2qUlT+*b_a+8*EzXJH7lw?jCdYiYu!Lld0OX&P~fH7ucH!r3y2lCiRcjtOV? z4aZ6o>`_6GPRB}Hah=dG!TAoXv>tOIt)U6doHU&#v=!T3;|b2^K#)#rXe;)d4HH}m z!wNkPR^A9R57Qc`yO`a>O1BTza{TB5CV9iv`M*Z`iT3D;7$ zu^Ob)gtpRkH$?BQU?(Naj~bD?AtTE1&4l@xdwYL~}SzAk1=Rth{+*wnFBK+UobC7uvW}gL*Dj zqG9Kvc$V&?m_K+DugkAzzjxCV%y*FvO(2Z^0~#PmI}OfWwH0DjFA;FwuGL9nrl+;z z@~|^~O(4u(P1BYL92bO1E0%ML03ei4fYt=V*4SGKBTw32IJOFNc+45Gza3%JQ0zl* zm_VDru6vJ0ggg!O8Q3ofE5u}7-TpR=9s_$7(;Aw<_==r?9-Y!azl;6NHYTzr$9`&r zQS)t>L;yA1K??a?lm}yl_Lw@gl_HQ=OjAtb!G6k>74piaR*f{Iu$EzrE6vV1X5_*nmiZ1DBB~_hjSVtQ7rQS>Y6}X zVXKYl6rrt99&EKG30o6Uf;hDUz1T{^F`d%T1nL;h6?t@u&{n!9iuFhY60ot-1ZqBG z7}GFA`v~NpCA5|9uTq2s5MPv<{e?vd$E7A=%=)~(#402Sls`_T;Cf6WDqgGAR&i?U zBLX~26R5{HU4!c}tu-v6t>U`WAc4Nm);O_>^GCv|(I7z5p{@zc$Qi4chM89$+6rSh zd+L&eO$SyJ%u!9mPof6mWMicXtX^1}F%2`XJhT;7LX1_z1V^0MN^&HosS!xP#tIrF z5JUDQF%2^>ue4R%JBvn&uo5T_O(1{RC&n~2VnSQRW1l=p6DF7|^Q%qe#WMYd%%8Z_ zyjcCQ{WV=VTk;6;i{ZI-b@H1ALc}y;6GStzJP2CRpIDNhC)Ii&i+SQ`JD$sviq|0$ z#mXnV)M^^B0%gl3VO1Pu5`+U#lA4gPCW>J^Jn|>nSQYO$ucPa6oHx>?2?8Yv(J1yf znpQ*}vC>x1v$-pIRlGjn(!07!nP+X8YeK@s9w+jVqBQMaJi^R}-VP3<&n~nobkiigl^+1Vu6WWTk zuOtyr11ZGX8CD#x5JvjqwKID-TX!{qwt}^@roC8MLR+CdV(na#h+~EJjFqXjLYQ<~ zLlfw)>gsYHohG!EZiCDPkFe#T3DhgbkaU{RRved*j`|6%GhxMYMwop}tPx1a=B_4C z{+Nqu+9PZ_v=viZlCUW5Xacnob5UF;9c#pdwqjjM62@>|0$-R;E!%`2t7bb~GbNfW z14NWi{#|l16>#gM-JeU2s)~la@h9(%c1m?S*Ulem(J{P&G^^6&G>0MK}{?N}w zn7y;6U97O05U+DyThYHu4WtiY5NhRR^0N*Zh8>0-WuHWTmI+?ZJwH+Q6iN8o>k7HT zt$P&rUj7WLT;{^gC1RCKxz=#Gkkrt`bD2W!-N)Mh zMLM)qF@Ic6d+CUCxAM@M+_)}L{-~4}b0irnpFrP^J))u!(@DaZqE+qGu!LTc_(vgM zOl|z!{HzCl$=6fnnn2mabu6Zn8rlk_=4xL<={Wj~d~Sz)r$lP=vx;<5!y^WxUhSQr zlY~iFv0jzTT`5J0uOgtgtZLs_!_i8^656U*UtP*mgtU?TEaYyNlgbj$&Ce>ff~1Bf zP->^I>YAXFglE+`%qte4c#1j;{dQ6MaxBs{A`t@MaE<*rXezU#QV67(bWbW6A8!dQ4s-Rr3uvVI95`3y>vjs624V2P4cvufHD4paD6jJ zQjVUp58gFP7;U~!FL&LAovr(CDI!hVXJ^T+AG{vdc7&g;s>uy}bpKxV`rw*ew=Vlj zIjNMJB*EO(behms19p{fihkoXsMj#T(u4--G@-3rjd2=HA-cPi+xk{A*bXr4OnV!h2y{$$g ziNS832o2J)Mu3pLqpa}U-mCVq8Yu!mia-o8_hC9f!>;)54tKN_%HzqE^$-ErB*9rR zu9JqHuc56_&c-;66cK>MvoyguJg$?5ov)#-P+wo@u%}IViU`2sS(-r2$I1)WNyE<9 z&{k-7C!M)RX(9lNXK8|SI9w+UJ6}Uvp~so??(SA2MFe2+ERTrhjJQr3cD@E@masz4 z`N+vmBSi#Y?X%Q#(W7Fut!dc#8rll|`LWwO4eG^2fDoRg35*O_vEn-Em_Wc1+6tqO zF-{{z1oaVE*V^<&H0=CzxKYhnVSHsesMj!ok(%isohGyu<_Rp1l0<;`Y63G3mIvvy zhPE<;YvOuUlCT;c5qVo|UPW|TgFYEpoqbtN+&-x15mrMJ^krz;BW#&#t8MP8iQ75# zJi=;dg1!@IkoE|xp{@Fe*O~oQNy2Jqf*u`ckWOo8tKpMt;(oUzVKp?tRVp+{r!}h_0veiN*b(>3S5>Oz z_s^16^gwI9`U%jQVAv7&ipHi_O{z><>9xpT6O19(IHbLlXOdRPAG`%%I-GYHOq9DG z0a_CbJB_H!Ex|i@F3K72CJ^TJ`Uz-gf?-EQbvK)|LVe|m<*y0Qnqb&zL~YP&@DAdR zc89lb2=jXV1T-|kup^?r#A@&ko{RnizHqHqKLHI*Fzkq^PqZ4mgXf|jnEV0 z35FdJ_3c)Jcc6j(oHKo1ub+U1CKz@^#TAn(CrTShTIsdOUlTU33}zX{HI93a2Nlt% zriOm5URm&Z9IF%o4NWlY2+6CwjDt2Eyo0>bD+^w)pMZuY7yo1zwkwysuv?dsK8c`dx8oYz&qTS)mD8jt%G)fWB&;-LyBkD`6 z2Jhgx=s)o8R_i&9QUo+K!LZYa`b4Y2J9sYoLA?3XdQPJh0S!$s>@=dj-D>a-o{Rn* z?+3M>(~kkC#^~J5h95i( z-;lyyqol?L=ZCrQ0rLCxveJG^U>Xl1OQ81y$`0CX-X5?3c1jFe5cYx02Zl5ZD8%wxr^FU zx+ZF3>FzagO(dO;m9}DPq1`ybwW1Dxk-OSTw-4&2W2I{etXSJwHXdQ?t|nYg?-$3) ztGgCO3bhqm5$jlru;qcc|L1GJO@LrqNykbPE*E?{O=v5W0aMOgh=~9psA~eH$rzGO z6WWSB4xW@EfLaZ-&bf2;^6D!H*5g>CBw^aQH=`ixFF|d^-k>BAKm>Qz79@Y7cE|dP z>%(Snw^*{BYvR6VYvP`PG@k7D4BCpl8Z=500q($xJvDO_*V*UC8UaE{0($7rso~Yc zn9x>CZAk(WRznjm7hL-w4Lh6i00BJf%6T<$PfaUaCmjJZ?nNj^LXn^2Y%djPa`Uu8E(@w+vH?SIf7OYsqq0Ml^L@C-4600oJ z!Dm5(ISLJi8zxH8j*#-mvOM@Krh~mGXtpR@9wmuVw3l*Q=6n`&lp4r|qK4yw6j6$X ztv!7fSSon4xbsB9EI}h-?wN@R3*b(?^F+e&4iQa@Wvmf^&{o`Eg6pv!iCBZ>Z0Trs z0>a)~eOVJke{x3?@g4?flNQtBxjQ^7ej^R5!R}2puCx5{?3l3Wh~G7e6-y9=_ny;> zl_ui1h?>?KA}2AaaeWlR@jJnW35mPiRVY?0bI{%!EH75^E;g}>>ym`M{cs=x`DbIL z3FIjCVj5kyOJO2RQsB9MU9&_uiwOw%y)Vx_I(x>Sm=5{QW=;+_w~ zx2O~m06{w9{V@8u5-!c)y3HQ-rqCy-%#yAkjzm0bqX#Vi?mYLR-bX zT7v}g2m5K6ayu?XDYv~uN<$OKY3y9~=oF!?bYFs$a~$-`ToZ2f;xuBK8i54jT2fc% ztm1x9(vc!8fcVC{DRllwIPSIaV6P@>0y&L+8Gl_Kw2D)!^->!8x$!;;A!0g3XsdY4 zNDwa3k{v0%FP#?iqd9>AdGnyyr zd}mB-j}vLL_c5kEf-&)EtKt45Wv`wEE2NwnakxPO=>Xx;OoyGfvpi@Oj{u?_hZ`gq z6KMDZzVOHL;2p+15zfEcCqQ#;sA*$H3-Ru5L&DnM=UNSI#kS%TFJCk=vuM{L;lt~E0vcSIf*@_o z;X?Er-9LP3Obffl(N=6-KCx=l$js$e^be08?Gw=8IvNCNW8N3y>8JJ!KYx5btD&vf zYJK9hks~t$pWH9RKmA;U=|KQN+L&8~IQ)th;rPq?TS8lLcau*n`{&5a4wttG@4DP4 zph0g02-3155@NH}bMsT%53w5BiX($hoOkia%v(Rt%^%mnC!j&!5(v`993dLF+#BS_ zNli&wab)m`wB|B^+L%*?Sh4T()i;eCX*IMJM;xDcUTWflou03L zJVDsJlDSV^9o}H!R1(565}AjEF#A1Ud2d9xJI;z@lusNdvAVm{^OfTh1T^R=1VP%E zHA0NMH^`h3<(0PLtluYcLcD!nkU1nlK!bit5TuP6F2t%;b2E=bWv;Eb9`K28r3CN( zZEj}g1Yz?kdWQglv@vZZuNIAJk!^dWtBHIc0V}R7e4;{HZRg8dWT!-RmjpEUW<%4) zth!)iX4-T6Wyel*ElOK)W#JP~NvrMi)fCfF#AV?eY!-XR=3px(T7QS~qoVMZ`$0xqJd}QYMU58{l zM13L&XwWYXg0%b+`;{Xzy?+{!{r*AMQ)?@F5PV{tp-;4wes_(OdEHu{fQBo7oP2Th%C0QThf)*ENB7S@H>O24X~or~Ph2h~ zI8y5Fv7>zgH0m+ltAQYG%-2HvL)u{5iTha%ZN*ipPuwT9eSc|#YviAPF2a0|2ZFTt zbR`|XOJCCa%KnznR_JluSs6{-C$;1O=}Y#y+$W&Hw}{XnEx+O_#MocwW{zk-#A;|O zu9tn{aOp*_kv?(L1OW~7sCbVDg0wNa2{B7*$O}?al2%-K`@~uy4wcbhc!B_pkpb_W zL6DBe!Acnit%kP3c;(K@XyRJY_)YyxEn}_x-{qCE!ien7 z%D9o!dJxQ+LVUH~^VQcU2xwrWW;#e4)8f*RnHkdaJRGH5TVZD5&dRtM0Q8Kx0JDq- zg8Uu{0vdcvio7CiOio(VI7g3)`0vdd$1A?@)4kanSbEB%r}JO&~}c(?;@2#=-EAXpGWU^e6koGZL$bLQIXu zC=$@%doB>9jTt7yDMHMR##(K~^_fq6p2X^U%5%d3NeWY9jl10 zPebkzu#&G<#o)Q|0U@pX8jd;|aEivZe%O_PgGY8oGksiNS`A!lRtG{)_x9(jS z*NthAkaU31v@u8a!PydH{s_kA?VZSKtKsgsOHb?26hdeanl@%Dd$z=wF{dra+dGlf zc0W1|>~C)ZAv6e08}phyTVhP5?60+VBCD!L%WPhKHfHyx5JH2{v@yGGfU_mWye|7| z?VZS~L(tV~)SSFWQwX6!Xj=AC&&SykV>XiX*gKJxd@a^$eAjZ%rVv7d(6lj+4aV6L zV}3)q;JK02&f~jTjTLt_i4YouN89=Y4b(4tC$gG9r@Pg7{p%(XLW9t>^c*+iY>6?W zq@CD1kyTyYK~@9fM-vF4L1@~T&e!8?i80rShP@M6?bod$PDc}nD2AFg=8gdSkBu29 zd1dcJR^Of0BQB375JICoG;Pcwa>ff9A4r+oJCW5!L8a9|EolNFGzd-Gx|@Xt>aM*L zS$#PsV>M9Qn?MK+LesVlS`D;8dndAb{p76GK&x#6Av6e0+rGqVpf9m^BC8);_Ou%4 zeVRZB4MNk#+`S>r8ORyJ6Bgv{oyh9@yPO7k(IyZ=gV3}w&mV&G62=^O>)5=#6Is3U zwbQ_8&;&wg5Sq3lj@7^zW$#2*8=5McR~VO?KnM*&)3UC$=T}T{(~s_0W0QD>+!pkCQL~}G(c!t%G#BA(E5Z08I}jEisjt4 zG+{~-qER=dtw+aoH;}rUE!L~Haedt-*ts-;kuyz*1_;)6gyS|CNE^(uec%q;UFOj? zr3s9jX+ktWXj*>FTw)_tHy9>oW!TPP#r|X4A9pHEn39BOfY7ut%TKX=V$fdBTe81` z75l+f!|NeTNkTM0Xj=Tc*Vw*2SS4qd*zdxM{rN#V)kBz)glK@!v@!dPwqsQAjInm|P5p=o3K+jF(X94ckbc?q7&84}9B34~~X(6p_)A<}`G$oUnlIMYKtZUP}1 zAUs;nMYEhI!iqCiw8th8q5(qF-kdti`7W%AGw-%dAw&cHm8Om97Of3FJ9R;(IB#zo zuLsaSHh~Zg5L`_lES`yIjdSW%V>4WT;0{+p=;xb2hz1Bv+cCd z+NUXmXn@ePd~-Qk4}L$XxE_QR`;Vuyotr|41_({dJFh`*J$Uj4#q}Vp*bh!VqDxZ< z(E#Dm=8$V#-`-5E2Vuqje7n02XbK@3AT({vgV(q*>UOmrgcZlZwRKG*L<5AT#fLn` ztp{ZsjMsy(;)tBo`wJpUho+5LbhTR#wp8muJeM;I0YcN_3y;<~ebsspR$K|8pKk&o8Xz=n$0%DK z7;)^K$V#uznn2jR+CH(mn=W%u>37Zh7f-5QKe*Sv$H6%G?^`7-?*}pN+UpW_>%j&I z(Ey=o`8H~lR|m=b-QJ0;Hha}+VE)hqLTC`0HfHg9`1YJJr<}eZZ|_7_Eq-$vmL8MEz_qe6QpvRc3A{Wcw#UpIje8ib~$Z(w|7)RHC;LW9t>F)cr|b2xLev_*R-vidpukWB|_dlLwuL1@~x z!7S=7+MvA?Sq*u?X`t0Mfe;#mrj0q+e!olRC$b*2cOt7_H=YpHtBy?}ghqd*X=ARm z-ysuU^3Vl&dndB`y|2?iFWLk`Xb_sVeY?#o^zHUeWOe$5P6MMs69}O}XjE{Bq16gG#!soc0I`P16CZDux=|!*!5tF5DgHT_Qu*Q$3a+e zd`;^81ren~)Bbvp<2jzoc>?mS2}D#Lnl|P?(cEV}X^Whf;JKXdp!}Oahz1Bv%l@%w z4i`$@<@^d(oVTGKH-Qih5Sq4aFvK{B7R7lYtT_Kfdu#$B8Xz=n%#P8V`XyGfF?2%A^id$hbimv6kF-<>CCI@dFo+PTO{hwRvEBh%N8 zi6s2$8tu;NXWe4^T;_;BM>=9pA_o55Sb%bp?Y>Psu6p^H1 zhd)<;SH4+cHLl%ivCIu!xKFD>9DeQlPpw8w1e(bI?uaRi7sdo=D-dgFtK~BsG5WDt zjU*mi=!j0EYO6HuYcS==lZX5FuxVOz@+Wa#As7CdSntu-J=!PuTv%Pu+G)%>bYUZj zsy>bwa;s1K8rn+do7StJxMfqPQ8{FGm8N|{Tj|_Q5^?)5o16OzsENp389wy_FW6Gy)Eveg*1Vpi1#X0i>V_A#8USDNV1+iiACr0TBGR!_8>WQl7} zT3kO7yzuOc)+(H^uu9XT%iQ&fsk2?ZiqoNqz1zDq{qMR(9_^((&{jHDTF(;lAKPjJ zo$p&b`n-)HY9+6;X8`5eIq#sPNT7W%4BFS=9a!nq@_I}J)ZiTu8@=IT_27j*Z8c&- zTj_k$dd8e6{={3vkMU`rr(fOF)D+MUb{+jk)p6HW7miy{o%{QQXR9vyazb<^2F*~ z?y8xdm8NAErNruOiB*q(Ej>^Z9m*ybdgZEfU))&Z(Z)Qpv@Gn_zH4~$Pg@_Pt)^@< zxo}ujb?(zIlEed2f`>~9UVQO6-L%!+!K;Pl!>V)r-&#^t^XIFD86&E5JG5CQC3vHx ze2}F4!vEZKpeA+@CsvX)9iLz37i?%EHx~cMW%%|JJL#1LC=3CKvi0Qk|Rk;b$Ig%*~rf8k%(t z_dI^vsoF~CmDV$+ZsV@mZ-i)f#(*OfhHJUJn9dRmYt=)mu1In*)?4MzaMrTc}00GTJ4a{Ui6-O?StjD zXtf7rUKWj8C055vi&}Va)q$Frx_@~sT5aDKp7v;CewJSlkbicLrL7n%q{&amtK#?R zEVX2>?@xX8o9gmfwAxj_F0axt@rkaoAAFK%ob&Z99x?2X@>;ao`~}~7v@v@NF;j@? z-;8@zTg~3Sq86?8BB_;HPgcM}+#|&7E5^P$xPL`0TJ5wezw)d!ZOngV&Afxu_{%oh zZmK4(7*$b=R@>&1&pcX6@awYd0Uf)BefMrVOcIRD-4x>fhAs6~%+;uAAGD@_|SQcCcADZxI2!vi((!+sUD z=;2=OI^CmXm-o7|?1R#ujA*yjRBfemRHw<9OUF;j7w$YLJaNk%vU<+BD(F%B;?U~c z;~OtZ%y;_@cq+fyf6KytSGMzrE}K@`Hh<5;ud6gI{=~zt$xpwfEWENyr>wSmXmyX; zvKOm!UrzokK^#4zDnH}5{liOd**`n@NcUW`+t*dUXDVyASy-K`{q>8g0sFY?1J3(e zYRSF}9?XCGV3%y*`2N9|BqyX))Kxoc;A?&--J>JOJ!53M*b?0WqE9--5rX=D0beQouW#ht@r z{?R@A!%;3BpSAN-u5(1*lytkcdhw#p;h)F&!~+*QdhW(PZOl1$T~_`1jh(~4PwSr5 zR=b{GS-WPn%&D&W%FAhqRj+HS7fk3J_PgCDhL3R?&CJ(Tnl`5W%EzX^eN?A#akHLT zZPhGr1WpZ-XC#`PDk zT_a__UAS9#;sf2nO*;C-Hd|HH?k*$1=w33)C|Y)A3UQnei`x6d{4FbLkAI>%H{f3@ zsyy2Cs@W~vR*2mav1&Qj#bjEaAF4Dhz38Bw!+~we!mDq7HKVQelUOZ$v^v+kYDI!L zYsk*woSnnuNSuoFIn9+{AQ20J&lvGK9~G?XT|CUE|JVe%uzI%+n{e z2kwo21-HsGZe;Z+}X37bt@ zlF?Rr^zn&CBS|L7Wi-D9msoO-p>n7n*hm8NAo!&#e$FTGI~jz4%wMqBBg(D@%%ILj^&B*`71Up3(vf!Lsnbq5kTw7xu|WPuDrDCi15x~FK0N@ z!~9eCIC>^4Z!LFTT{&m=IpKoZ>WuDXw3Vi%_t|50<&fHQLi3hS=pIMY#$5INo|#97 zjR@yl_;5yB>Di=DeDQ1h%=|OY4)>lj(<5{rrDx)hZKY?jKGFKy z?K73%oE9$WyTBuKAEjye8cDY;GiQ8#M);4-=4P~&p2_+|^={{99z9}6IOF&aJVN(T znwHgei}N!}4j&ROIQ@f+w$eS0Pi+5s+syN?ofiIQ{`|b2C+b<|MO#4T zWW@PyPTS0jQ%?)~Eu5d%cl69sKgpQmMog)E;qKw#O;!0k>lIcIYh^SzZ;`Ay*L%9^ zt!PwxdDNq#arP#wD&Kqfg7Ew&AMyyj7SXgZ+fQ3l`N~V@gbzPho!3^wMB|!S)w#Bt zJ@4tsms>vBH1qm^bHh(QpX3pGg`{ceOTOGX^M*Mmd|}t>ytbMnBWEZh=T-w>uJVao z<(`=<2Av!JcEocYq4P@9GM>NJHnWeEN5z8qd2KaQ@@L$A)wvtGzf$EB!{2S2X)VN* z1fk1D)5cu5X5a8%&+HTazWm1gONYDB^3aY?d1c_|?!wkT=dT!77H(C$QMm9j*W(=e z{ZwzJzxDI(`guoAlM?LT=I8tkLVQ>7iM7L>RozuSZOoh_HxE~iJ0M)x@7uh#(zAYl zZP0H_%W&DCvarqjpXRSCchCJ})RZbs=qJgk-z!>%-w1KfJfC=}gQM5pH`$|&`RVIT z!;4-k3m5G8ZC+dHm4(*(f5y%OJc{BA;6v|4nv~F_ONTT{cDWo9=^(u~X$pcBP?STE zqJjbfgQ@pNstviv-cZ^ zOYvE265Ga9kwqVllCs!phmQtMPus1>LfkD}Ph8h0Otw84E^n3e8w4L$oQ5;>eZyp# zU&3X+!hXXt@KTw?P8f;vVI+R|$6SYxxK4w0NuGOQt%r|Li1dLN3dA=sb~(Z49jApj z`BZheFTJ@O7PZ#lQoOb%(dkB2dBxvCZVN0j2tMyPEyRq{739&nQSwekqQj+lOPj>& zqIq(yBM-|%k6H3|>6o;RDaqc*q0*DTb4=RhQ?MGfB-yiNsLm5QUD*l!an9c?`I#Rd zmOFY_l1ouGA;cFUL}Y9^C+tR3dALrvENtt0)lb^#;rdJ+XFHX1x&cu-gs9m>(_NRF zG(<};9ZlY{v8g=djg(yK@QK!GgO(?Idp!^^^ugPko}J}{y%ZtaEvjP>DPdYinc+J< zoQC(X%w6PEup;E)6160knz6ri+BvX^7oQA-5Tjp$_CFx%H-YW;XT4I`e5e=*D|uCy)PV z@o)Ibws9x%*o64x)etRh@;DaXC8;&hAHZm7z}>$+UySt!F#qg43)cX86uOao0-~jx zt3NadzTd)WAsXzslY9uGrC;7pwz$;S&-nuwE&Y7`s>dW&{Z!cb0-~jcr?wdc-v#0{ zoPao0+W8uyr5~y%TU_efDgFRPOMk4q95xBwH=KsZ@=hcBcknnB|D0>Ru`ph>yZ`7- zqYuos+E?+K^#;T~3sdvkO{#BDM0~09#!kbtOV+8+-`ac@dT@H#Yu0l>l-^|$wU%o7 z?#m_(@0#ph)ZP!#Qn?NnEH1_OCitF(5bIwlVf!HV$+iDy>rDMkN_*~Ezk4{r?<7Q< znI-J!fJjX0_KB)`!QxVUM~Ukb;;G*Y+hH(k6N{Jx-%;W; zyjgWiaeER(ORv9m!qCy|7VJ*LoOtBO#gIL(a-GZBPe8Qv+Lzy0T#C`%j3LDg_o91fO@D7UI>?73?n|TIwQ_EH1@c+9V!1-7MyLh<)bw zuA^v%b=c#bUjG=R}k!!f^lJhxY={@7R?*TUz0(k$l4;fH14o|es}atkem zYp*8pc{;h2if4-vW%|lEYqKxN{ z#;k>C>2GhO&83Dsur`3v(wa*@8~Wg#bmL}O&v-Zu>!M2* zS)av3$gpCyY%X=}$+ZEDmP)ty$Ky5G@_tRL3A*e|U}3(W=OA9!|r7yX1m) zU5J+C?(-JkOXXJ0v_9|cId44)(bD{#g>6povmcxmqWtGqtxgavm06tM=2DHTY0H_f z?OBgWIQcJF7%jbitgu1wvnHH|i1}-2?SW`%S6T&|OZ92JR@MAc{BItU==y-5iV~;R5S>Fo`uu!q+XA=t(FiiwTrB6b16PDOk!8<8P3x~ zhsnl+_Bi}(1V3@{PCI{K9<1-rsO?miXZ1tGL zg%27ym)nh&pC10kAo$4*weX&)B46pS@kn`8#Ftm(|4Lb(Ch1DZ>PB%JSI{8m4nG+Crp5D z+-MN|ybq^^=pMc&`JsgI^3f80hf9r_>N`Pt+H5umiZbzp z5U1gk#kx(&&lh@1M#uRbF7=8Ve|CHElMtfQN87Bz@3fHDij|lAL{tBN)(3DeweLS^ zA?L3)^j>2Hz7Ln*yi&~|W^U3JZgkC^9!`UI?lQxg4tuGuHmfJORP~N)0=So2xnoKQ zF?OQI`V;n2o4?sq7JKtJUtd`tG#*wX4?yY_`tG0Y$h9g zQ%inPM3?08r+0d|4z3%X9tg9oj<7eeXjo%|;P>S;oW&V3!>ax|#8*x0NiOwb%x3}I zOPv%W4Sn#-C+9B4)Pud$2l_TO2wo3P!+W+9UW*y~a}!zOv1s|;L|yYLC(WAk77^n8 zsMlitfxXmIJxwBZfcBgX{xNCzL8o3X#VnuGL>}G|ExAUyYo7k3Wuvb3WP`kIB$pz8j;kLgaXm52Ub{9@ra!yM z;q&0^WjF%~aoed08$;&c@H>_5b8}nEe-6(x2tFq`4QFxgR<^s%X)S*`I?v%!e14e3 z3&~;j_fV=U!#6qn8*Xt-%W(U6EqiHnxcuPqI|lL2BprXYP23V8K{Snk6QHfAh5UKG>_0ON$uAFdBpCYtZJj>2B*_FqdIM1?(CNBa+V7^i>X>9ck3TMJ+>wZW@3 zC70qJfa_Bye&Ij*95Ovi7JPOdp5RbVNW0Ha;FBaKkw>gi&y`%unAS$UNgjxM86U&- zI`uhT=S<`m)v~2cf=lHVHG}u%`f?_6iLfBSX_MejhVW-TNC&;;A1U2dT#D|CQaKa! zgqwPToV6%DU571gmWmVf>>57lO}ex82bU_2Z>E6$z~{DeBz*k6AL@M~K;Uy_RHv*x zNZ;t+9)LGF0)g*=q&wjoCCz$pBJ&#CDwEEMhzi~}_)7w=zMKiFNAPz6fI!+Hd{h$U zk=>`y^z%`fV@wgg%s$uOAVD;?0)NIVdxA^hQ%P9}z-U}$YUj`SW%g#FkWoS<}q8-$>H;q&=?EM=CeR!FHhL8Zbc?>TMi;8OfeF*y_Tz9oF? zKD7eQLG?~2HA>)jX5D|fb=6yW;2V5~lL)LijTrr`rA8FtXx4__H?ws^`rO9}vJ&daa%LaRQgJD=IQTqoj-~R^+Ys@sz%*WQ?9!VU)fz-f~(q}ZDmvJimjQ9=ZcS1!fh+mOAE z;M*u*l;B+9v`J7sg73&sqq5e02zrBn@*nJpOq#Xm8I+D-Jq!ZhkpeoDKWDT_&>I9$ zih2;E0rHRZJZIKESMQKv_vN&ygGNd4tuw0T@CF)2n*=?puitE=pA8Ousx@bVp2FAq zGHH|GQaldI+4_*pz_&EhEJ8blc zwVP1uOnrlP-qgVf^&UWIX?!0=iPLG|8BxG!oaPmT2;FM*{s zN+mc!Z=^*J$7z$`QtJJps1H1K&IHZW(AshjXXx;8g64d-H3v+OT`tA#d5*0sI6<}x z-!sB#RVtsWLvSgwk65ZKM6gt3sj=O;6xm&Dkq{lO2S9>61NJ7TO@d32m%$#)LQts$ zeS>z8>^a5^nV(06L}Z!YWd4$wimzR7fV3)A79Ctl#qIwWLHcl}QVD}zEsGA6qMEDB zD@Py2@0%IDxbN74ah%0F`)GcI+FF`X>Ngv(>OLAJoS?aKf7{NbxE;*m4T3s2L32?1 zDE>|kUMem{c31nv5CS3fq+TXb%dpNwqtymsR&!2J3Gp|Pc%4jwOHsSwFEwQ$P>m`T z*+l$ZDw^AvO^|)WEJNwYmLMC9zc|Hdli*Th&vmJ4D({nZoq@cwu5G3ir%fH4$czTC zr88-h;8GN$XwR7wK^c~Q$C8%9xk7D)woB>oxvlHt1b^Qzl`7~tg9Ml29v}+=igXWh zg0d8}gPc~S3KCq3<{jF{90?!wU}#oE{eiRD)WHcFW0*T-nS;SnaVct1{Ee9$iD2vE zZ{lz%PODP+sI90!kf3(UR!5NFQq*quuLrfLo)ekYfX_#>RGc6kdOl{-CSgitj@O*$ zIVY%2p(_YV2mHqzS16U)ZuMemBxaqpR71?ws7{zuQQrhTj?dNMBik2zrxW-LjIYS@ zVH{+ZiW3z3B9Y_R65}nMdTRoa@s5vm!dwvTOss*d5iLv zHcQ0`>T}EoIc*YLiuxS$&zuRGYoYh$w5fv=H0ML>WD;D8?8<$|m7q})x^l-`+SI{` z%+YtBHDtl1c>D1FH+67=JT*p0oHhwAWy~(Na%&P~k<}dJQf_{Q?Upk^UiAK@;!v!=w!zP!DJyRgxt^A|u1Sc0UgiK4@KopwO z7rdW0o3_f1K$;VDt#yRK@6r7R@8t}Y`X(aaeRFJnrQ^Q|q&Y#?Zq0`saZba#CPSr! zNcH|Uppeq>-vrW}plhw854@-NQ+V%ds8o7Fs(1T5PS7|ghhFH9}Ab#*Jy)boq_2SqBgvD2TPSw5Q)s) z=>k5ycDz_B{kf)vcnij@J$^w%A1ECs_|7<|;jQ@aW+T)AZ=8a6O=j-0>uX(GlMpU( zPSqS|s^k4P1NVo>e?UE4Tj}O%IS|wzp)?f7?GLSkd=%aneMY*g53XI^LBbbGWZHI< zhVxg@R#HgP*o?ZH_bvY3@CD=UPX01nS@fU27emt&5dUd1@;i^bP7*I3>;d`W{>9pwG3A z>M>s1$g4uw7b*L5S=Kq&Y#? zx>WkVKKtj5(dz9vxSMgSc;hrZw@-W2=gL-|HuDdI$Sp1@PZmm>I%&9 zTHW0JkE;Vb8A|bz@DeIvAN&{od{XVPKy8tr{T5vk2YhfysStul0KRc`T&(X;%@?or z?c1|6_&Ep$|CxlM-TQJnC=M4c;YwAt)}>Cl98e|v{|H_WP8&MFyXkshKU3N9no6jz zGZ`PmiK|tc;5T$%ye573C-{9iov8t8u1f_q$9qw2L-plM@Op3>-joh;;?Hgz$F-9b z_Bnm7`~SZPUP4V2-BU*H@74`Qh!8DWS4`boEmhUy!F<03_PnD<30>>9VuX(qbdC2V zLhC3rvA2BlU=gK*R)_FjoSoMkbL&g*N8=xkUGZLc+Nw#Z!E5?FDDT73&I!DpbTAMkh*kth z<3F%huGFxF`C_f|QA!_Or=Lsn;U1yr$2!EQ*H`NOOX&g9Jjdn7AGw?YZjz5umc;HGQ5lfi#X?tOutR z;nSSYCMj&u%GQtSzI1K0uB*r-sDwmdsqoqrR{!(aR9hUo)IM~LHP>UB6hO@lf?Ar0 zY)5;rt#IaGJ!sxhoq{up)EES{LMW{(ppnd)qb;F6plic2kd9#Mq7=0i5!hCE4R2zL ze+hi75Hr`ebc&yD3i0PI?`!9K7%`mwJY9Vb>pej1C|AJ$dkB$dN)tstbbGZy!<*7w z9Rt?2bh1k6n97XE)>wm8snWylS-e!dB(wHteR0o6K%al@5z*_`?m|SCI!ag9l6xU%AtAO}w)`*1tAq3T_QqKk+P7Bcnh^xZR*dC&0z8Wh#LY=z3A=#cQs_8s&mIAd-QMg%fa%ea`9ZiJ%k^Y9-apsfnC1H@vd6hMETlasj?7pt5d))H8SX6seIY#=u8xl*iz z_bC-4)_YRCgFZ3oV5#sz)q_hJrE>LUC1Cv-YHOAq+l}ZT;lnH4Q<=otpJmQ94-#Ce zmm@Rlq2kBv+A66ZMiaUZs6|ot#c@*gCYD9@U{D7q7I&21zQs&BE5W7yh?U-?!VUkc z2cf(eb5cn*)xcO>txsGjKC7Y`!N)O^*}mUD!d4eM6@4xUmUxn14kv& zLBa=DK9s^4MFd_`35gC8coEb=QaJjs>|Edd2?3+>>+kT)-KA8b4MLS_-1ZdjXIFJ? zc?q-B15s5fPLxef@wU71u+l-ap+ga&QfL!-i)1Cla+x^?-O+~xjmjY5!z*XRymd`REqkaW>-*$ zxy6!nyr{meU8wN+Dc4`&Xh(hbCvdI=EgTX+ zXC=54&by#R4JCZYs{R0P06UYxkw~M2+Rf0R`-2haGyc1E4JjxI>BzPRRjD|E9xmAD zE^U-b5r)*zOnXK45#Af+?m_N`ea@%aUI^ebQB7Aif&4>&Mb#0Rx`xkn>$-$5lu$Gf zp|sk4RdM1`Si_=wVZ=hj=u5ZtHR!he6>zpyM05~ zv>KK9i)>j4w{?lod6cUIRRncl`;e55mTLxMZIsKZgA@E3X(aHUrZP*_8cr4KQv`U{ zl|B!id-Y{U&`AZHMVwYyk?KJQdT{IVd#Vr68Wi{m#uc;`Mm6elxYqsy@+i4&Y(&KF z5aPpv#nebd9h`=71w{07VF?dFpL40iM~WyNXlqU4l-uXsK?f()wd(WMv7F9qC%npR z6O0peA7~2)*U+2PR@sdb%vdy`J&t=#wjIZn`bRpjwsalr4=f@1k1Pb2(lKMEKD>3- zQNoE}J>0(0rD-;0Tg*l{!IQ^_yX-mT2Kw`y38Z?Bcl|ek zG$-g<>)1Qwh*dxD7^Q>0Q9cnO4$9l;^PCCQ3XGtLQxjJYl(HX-@2=a5N%5HRzX{aA z3A)xgBH@>mwq}GY9rO*>gU6!udCmmt-~?T3qUqM|_R*h8DIN3;>fl)zeV#LcIygbs znrM=Lj9sbE5hqlN=WYK@sJ3GHAkkXKoku3wCtjbabkH|g4~o3;nm*5&KpmW*YfU^2 zCqGxs-z@&U2DP}yLPA)j#tXI|C>OX6LhV0xN}hH zpl{Sza#srQnm*5&P;JEsoVB#hAcSj6ln(j^?~C?>aw_^<>&T8k9h{(RO$;4&#QF|T z{Dw%O9Sla{uD+ZJq&Y#?nrJg)rjw<*@%oRY4c<4-U9H1w`aEX>b#Q{NH4zJ^yf==3Q{Ev` ze7)?y38Xne*ILKfxJh!!R5;}wB1J16SdafEkmdwkYaQUDB>5=%2Jg#PTj=wg3Dm&} zx>ke_e61v3OW&Xlyl-$#CPlCAXdT%RR1YGE);ip_azdrBeP~U_AVhWq(wv}ct;6ke zrGvh~dSE}(Dh_?F>yaISIygbsT8BG!WvCR6SK2W#2$3CuG$-g<>u~3w(m~%~J#ePd zN-BM>>yaISIygbsT8C>(ln(kvjVrJ|6t~moT1R#S>Of0G1YK(#kQ+FZ8_+kX1MOgN zSH`8aj_e53!3nz7Iv~e!D9531PzTy`+Fhd0wT|ov)WHe5);hosqK{H-Mc=5l5}A1$ zeXez6N2s=91Z90H+qR#X(<|z)^)0O@{;m`F5u&h#M_=(27IPrG$J0WcV#{x>9eAd> zgcY4hup0F}>{?!R{!Tc(K@;^>2NZ!)^Y#Rk)X~F_sFkUE8Q%j@AmJr@(a?GRhHF|{ z9sDB#NDOFSGIsVy!vhCj2zcZ77LPRv)UjaMoakeqgO?<%eXT&f2cM-ju7>G7=21ZRtFbOQlk@Epn4^G2dcA!*yy&V(&fKqWOEY-ue1FBRe z@dfCpu;!uYmo~Mus@9#LdT>=j)!1B~iGliarMG?4>an~t(vNB z__{tG-U@goa<-@S!l8jV@ciJGB1L1T9ez0QVOWay(?+vle!z;C-FEHB z#N062IWf6XeMNk9-lR3rE2df`5?pG*+@Ub<&@vQ><@$s;0y-8{eJ`P42=P$O`Ytis z!)Z+ndb(Nyti4)X3hz64g|3H5>;)ZRwdN+C1ETVVp{nNV8WoMj-o)BcZ{n!L-W1|* zAab4Pn7DFnOY6#uVTrtcTuOt6`LXFU;%T|OwzY4^$>kSkC4k7mbI$qf*A*vX( z5I+F%Z1=)Z??S1#6rU^R{J{RWe0y22b+NY82UK(3B0|7Awe8z9GMf5>2<**GshRyx zH2h{55KlcnKM`#Sm%@>OBOgZwZ)t6>*0dOv*cB{8r_Rr)kDp+c6$@m;ZFF`h6 z2(*a{Qwv9Y4E5l|)xpC8?H>ww4^%B?%wT;s>eZ%C_+J5nOYynQ^$7v%yY|oWa@1fT z0$m;s_)kc0zm(UE8Fk}oy?{uO-s4}-gmHyuaUOU%j~~wa7{uQ99uBO#BfXR6%`#{q z4g#^Y$g;$DaFj49K2yyZh4!l4x;LYL0(*sJ$NQpP!m`r{=ObU&{ONK}L`{QIaROTb z>qKouw64d`8?XC+aodWdoE^hdZ5O<+TQ`%y{&=@)`2_5bo4uZK=e9XY_~_B|JkRe{ zA|s*ZoIoiYuc2d1k9PDQr$I*+DX^RvGng~#85mbf4)%?%^RY?bc*XgF<5dwZEkq2| zWBt^Li7k^_T3o7U!DrO`cx*{1kq*SmSF3G5xUr>G*4nzj8ms5zJ7BcJON;sYpE zukrb!qqdsF`*$8!(UK6QLSml-K-@a;W#m%m4=%+cC$3M3e}Q;X#`#--O`KnAc%aR| zfcNeCW=zFnEg`l5F>2J@s0o`*LXE370eHr}SV*Z>15s+}ny8LjT3TF+&tS7u?u?42 z8HIkE<{jBVZtZmIULBGr>J+pt&Ost@&Z8}%IZt%ZGWf|dkd(3pP!F^QrWHlY(C6+! z|54C^Z6!aEs;&5}<+DqdD*uX4qLM-gY*Czd7`<{@pBw0%T$u#yzS^gjZcJHtHKaOq+Bast0S1>}x*~Mw?)wX`}cfvf-!KJu0Fo{*5<3_<;E#|?v;)I^5xZeI? zh%MO-gjKgzbbFZRT#CmDTp#?#2oT4P?T)S=-_lyS=V@iBzi4OL#20)|D;wPKmxsVI z)BwwHr~9*s--EB^1X>@AWP;Ym&5(q619VjBH8c9tZ7nS>#XYiFs`Eg+zHC**Ztx%6 zBXj#q>LH^I=EErIrWt7Ihbeh|En;rIKk&Rr**0P^G8KvsrXz&nxb$Xqv}%CZl3BN2BqQz-WRO|mWtDQ zw3qI*K57P(ic9fW#3V*R4=z32E4totJ+9Eg1xKRm`?!Y_A`jGj`imPA3pgf$;}xwP zj#txjE(RT*j_*f5`aw&JOMP4O>3{&6IR5ca;u7d6^4a_TZqQb@lP0R#PB>_0jXax# ztO$q=jlPLm4|9+cN(V$?K^?*Q(E>_UYv31&*FR}#aVb9U%=v*nYQ?7I{w3g}PzQRo zV5!`;;&p;wq5)#yhZCdzfasMISauw{!Av+9WuT8bU*@fZ7opF&6rXoy>-vC*yZfOv#mn7uLZxV>z|83JWPhWJ$Knq{J*JOos-iGF4}&Gdnqvv)92%@X z*JoJH0)dg``AYX3yccEIoHn!Vr=e6oMZFN^gHmwA-sQLKU zXGM>LS<9tVi-O(77Bz_`Q1gT*>m*))nqPgpv9j&frf5To)9|Z3K$N|E(*G8eiW6rm zHB#~Jp_Z)-S_lj3(d|Hy=qP9_F2ya5S*jaA^xKdt$`3kF3N0sEHEs>~e1zN?YW|e9 z!T%EUIVVsb+IB1zr-hgeI!29(Pl$&8;8J{Km_$XW`I+P2L`6ZVIDxHz-Ur)_(?awE zqDR~E(S6<4B`H3_O=3Nqn!LPrT0{cO!8N7Yrs1hMw0*;S#-&j!Ouo=geXh?ACdTOV zqJ^N(CmsPQh}+Ss>I1z%#2;$tpAwxIIvs=PWAh=Z9DsgF; zM_~_|M3Sz#uOQT1l^5CyYm0RvtBs$Nmk{E4(DD2)Gvc3vKIa5)QBK1fnt)hYwdwY< zKyWE+1@ciQaRG?5AODIt0i%Qyyazcg#M?kTIb~;L1<({p@&;@x-XWUe3T+w8e%vgE*AAg zy#uX_wZ*kiwA5UR(?UE9#HZF;|I1)~IFWyUyEKfi(Nc3-c^p}(?YmJgfDSIT>6dnC z7*nI&H3^&_Q#xOd_zh}~Qe>T#la#cb>xK}hkNgLxg%}A$gOyIyW@sxe z#rxbOqJj8wM84<_Q1h$#rsoA+QH; z9IFu36H3LUcq^F1vp{t1U)2915s-7BU*avwTUvQ8RQ=m)@vJuJC)oLjY*43qkTNJwj`fOJQsNaGRO~n+H&IV>y>x3rN$lCT*Bj8 ziB7OGf#<2qq?e8V5(uv2ot2L$pMg8BT%RTu{Fo=f4}^K&OnYwXu%RB^9=#m(JmhMe zKz+3Ps&u&C2Yzi6h>Sb0MUD7Omx`pYwzQXO5?kFf+ruHdJAPfa3GTk}vg388ZLb14 zj+|H??_F&YHIBzY`{UgeQ- z?JatXS9t?mRpTu!#FL<-!UIeFtzd0Q>(INQ>b`FK@Kz9_GU!N8m>by>>cI(Y1#GKe zD+F72TS!}RDf0SUpUQ;g7boXO9fOgGJ&2wR#}Y3)A3bXSLslp_G+`QK!koZSNxMCq zR;z<@egAq1y@B9TB_`+@g)2oSaSQ5Epi<4KZm>>0^<=EF?YNSrMjv_r*f)qi9jmN1 zu8P3fd}u4XMvtfsP!CS*IUcM02kskiT90=0Q5#{jXOU8tx>E@8Ba~|4q_-pEpdOrP zcq~@=LEQgPI$T=qTFT3VXZaUEJ-F1$qp`~GW@LmCUxAJ@%Y9L=!x{h*7y*Rdm(#Gf z0z_1emlN7RJvf0S#5f^X^I)ki15s|!7=LA0#oiX{aq`< z;e7xG!SBmyAz*!1F540t@g!IVE|qUAM&Wwb$|SylQiZL%9X|$ImlM1moYp#8*FO@4 zIuibbdblfsst?>bIQ)97^1Ha&Cd5+EG57j;|8&^F;>4|Uu_{`^6-Z8N%dn?nzl0Vr zuDBGR+a>|;vXGDLZ0R2jV;7|`LP86mq}&nC$FUG_-bXH}IxP}+csYUkFggpCDmXuO z0`Y!avFH`B7S5$qo!m7`u21c;$dAr6O&kO|&UcMd76(sqoc!CXECZh8SoT<)vSa!r z2dq=e$6lKeIVXf@-z82Fc#442YEM}1UeYiT2`)AECXRM}lEWl00w^_qz8`mZIpK5$ zKd6Y=9!_hUc&tv-Xe784-j~+GO#=O3-aT!i{scdW^PJWx`N%g%`*%>P&F|JrC<-Hy z6KFqZU6j-CE)F1aFaJKGAC!tq@sVK?_+;3>yBj2wgK@=)tN+HT7!KEWIjzoq$e$ia zOV|zsm*OMbB<_NajXeq^<^tP}QW#U?Jm4dPj~KOoE{Es66Il~iMj9#<&!>s6wm<9YucpGx`+RD^8$gpuIaz zYkT#_tKm^spj2Fn$E7BLJvesy$BB=G5NJ`+8=&3gv^p&!i)_8@$5Ss{3avKnTABpx zjLMZ;=SR`}!0}46h{i4-(|Se?nm!|8F6hAdK?KfVI*Y|ezMkjhes3B*5C|@Xa~nM; z&TW%GA65M32T@CbDD}HnSsXmQfw2#r#przoW-!Lly$~Eb8bKO4+Sd$Hea8U z!PqC)o)@Cqz}V$PuikMg3d8++PHVe6zw(Tzuc1_2irYbxfISxZXS=%5<3IgY870+dGDNYN4 z{ybyEwa8vzMLAL7uvb|)JZr#d{j}_apJqnj$ulm+vlo+q6A<$In&Ht0q2?$>=L`6} zF zkN#>va4BvLOak`k<=u{T6URf%Q9D{roSnQyxh2xG_L_fV#3!JG6TG&Z)|PtU(r!@` zf#6bDLfUaR39QG&NB2in4Iy~zavC#1{bWDVII^CSg6 z`ayrL2$wR6!Xg3A+-ZW-ituU9C%F{rD+|Bo5vtE5Hf#$7TBW9Cks5sbtH9x!>FRTR zclfUl>%oa%w|x;1-Lldq!KHX@bFN3dvxftL&00H`>el^a;HLxGm5LL&#P@;y@NV^N zYmP-z_25#xwp^cC54q`bP&=18Tj5r)v_S&Z$SlM!_bHVk)O}qkUR$m&sKbXkjy#Yz zm3oRxZL3`%m3lTvC>;jj6RG!YD@7DwQoOcYUr>h+OI7TZBB?a0xzyJm6-}jC5G0fi zPQ1IiQ0jfhl_IzluPxVS>Ok$;%?Z>!VpEDa+LaDYmhp=H^zZ=vxmgcRs8(pA%bv3iF2!q`GlBhV?{l)03deMv4f=DlR0aVfrcsfs zbutMYS0u%2n{%mfPLOskh4Y_Et91CZCZEhgEYDh}kW%5ha9k-~TdvO}(0)))aVfNw z)U%54Y0f7(ftH9`fzu|zrFd<#5LyMyLA13rs<{;R45kiFD65^*xbkTwKFOtcZMi;E zN7o~b(#Qhj5)qK4XdgALTH`db82aw;Umw~MPKcC7L4wn!4lac>&H0>(UXe}G$Xar# zH~wvsM%L9V6(oawr_Uz^a>L!bEAEHgGoadm6!MI{lytX-)3d>H`l1pJfk##jo#R=64 zuD#;4NpLA%+nfpPXYwpu3db~gB2xz^aKw;p=d?+1DPG&037iw8olD{Tr_w4NKCQ_o zvk)PAIFL)3^$jic9g@a(zOy+||k{-ng;!Z3vf_4>V8vrPMAj{MF-Dn_D{}qS9MA zzcy+tcZ3l4wlquo?T>UX{24Ut@OE70+!rLX(gN@S$|B>c}zj~Y&V(@}8vPAKH&K4lJ6!+97 z(E;kv1&HZTDo)I(0};T)G%x(s<21ZE5?b~kv@o_Vm*NqCNu)sU73#Fi*%v}Yu4$Au z{amUS{_1gBhy^f0a>Ga|wlQ3CDIPhQ#3&er15#T#{XhpNJpCJ`73`hrg}-{776SXB z{l%%t1K|H$Dm2!j*bYvff#er|PEDR1O0>~297KNgI1Tjx$!Zs;#!P|#3npdER2Bik z2|AE00>n!p1eWk-y?__~R6WSs!Hx;E)wW%&EF6hkiqCmNpC|&vxs+B`Dzq*qu-#r+ zn&O2&)gNSIgt$4VrhKdYGOO4o-MS>jtpwKxzas^GUcd7)Yax`1-&c*8lJMT3k|}yz zxt0jd7{Ew`d1wX4l`F-q57#HeB_P5}?6dqZ+WCEP9It#wdf`vak4#IQ8)j4o$mMCz*@xq_7SL7vx=neC)<&c{8EFjSOkd)y+z+Pn%bAdQJxTgJe2!R&068z2& z{3*Me>1+Rm`FEgEWBUsrxD@xhT%QmVfhga&v5mHb6X+SLjd#58SC7*|TsSo~dHaTN zdjt?%N_iRAQ=3Gm(^Hd|05L5)Vko>}V<@y0W??Q3E8D+Jjadf7t3ar4T&XM(K#+L$ z%+wgLRrVtx!~+c?gZ1FF5N*F~WetUzR|A4e@yN*}MyI#3N&@jl2$832RIood4f|>x zmsxe8&tC+BOYvCCBnkuZ5A^wg5F*#m=-`OqG{g)=_gQbiNc2x6pxloVm=U4 zfWR5WiD^e5V{t7Jr{Onpp)ZbhSZ2)tf=lrz+$3V5FQ!4C3<0~#iQRo#1??`U;p{og zzay!wtg=9GDW30`L{S)1w*#%LL?{&}Qa)`J^dFp79>=Z>9tX!2mkP~yGCdA>HM^MW z)eIs<=TYbfIj#Jl4Sp~g{a`L8W#myTzk(fi(D5ty+JPYi>LY*7X(7fy&AYe}0GGn{ zp>-IOcmjwaK=gKNPWQ!jqqv0A@a!w}d3A_n8UewjR6o1xB_?43(GhGfjw?>6{&(Xm zPAflXV?2s}kW1lsr4=2M!1)LB(7`##2^_~1CvsW{oPRK*B+e)n} zV2XD+EyQku(vWX7e?p3|C@N$dyP{w&0!HA4vW43r^p zT8Jj6rp6owX)pY7Ddn%+RU?zA0X_=+phQ2Ig{TIn>8kD0e$b_bNCjWJ6r|BRtNXfA zJU`?5gm@Z!?KY5pJcQtx9;by^0{LJ!sCg6+Ge7=0K(*z&S$r2rh=vd|lm-H0A5L7E zeJDWv!D+~GU^c}<555cpm*V?hCeZ+9>;xd{g%Cx=cL5q#oQBitkP)TBNEASDDZZ~} z661>ObA|xX7A!RP#Dexymf0nzK^!I8 zcLCtuG3Tcyj|GBDh3-LT=7YDORaYFDn%n^X&xzt1f4oXDm4 z4u(l=hEml$G&N=_l!_CmkMcoI3sDSeeigDi>DGg!_+E%f2X?!c<_NIEn(jV9bAgA+6F46!ALO(UO~Es7 zeXES!9SAPP_rFYHALN6B7L>7zLOnQvc7-xMPJ=&(*|Y#6jaoo(DZZ~}66b)Z1q4QY zoIs08`5>o-Xaln;1LDznKyWF(A88WPz_w#n)GCBPJ5Tu_r-g_GAGH@Ezm7m~DYg6N z=4U3cpXGyD2shK?w3!d8Z(OM?JEOsT@b2lUG2cL`Izy>A@y5_A!Fq67`9TZ(ppAZz zOYt3LlK?+xfge0)Q!+%C_h5c-DPwP&?Rg9F8pLo*fWY-DPF(GuFO}v8r-kSW^KS+GO#p&R@iPG? zaT}yJ!rxy|Do&i=R4|q1Ij4o#3nf|zb;$sNOYu_#CUF*s`9NF>A#M+Y-_3CC6{q1u z<50*AAi6vb1efBc6HHt^Devs3!Mh3)$ zb5oNa0)k8N^Cc!xa$~st;f1NmI1)L5B_w~&X?P+RYF-4gyF6~GNDAAB@3lZ6$ zKyWD>uapm(#1SA~1OlU1PTHjh{8P-KrKB&HNrFed35)Yo4nvCnmK|kmcJa6MP zyxC}vaD3MX$oN0*S{0UG4qS!bydM5rQ_qNQmjjF8dgHC8o@n^|$9npSQ^-5{)Q9u8_D-Fn!>w9Ixc%Cxz6lCvVJy1J@>wxhFN>%ujJef2g;XP z-?Q)=lHw&XiTG8MoXS=E$PJ_Zu_m{^5@^>u;7xtMspt6C%Yg#D0^U==g;1?_Q~a7dIvhmA~Q_l z{JtxJJ56+{I1T5JZ>BkSe&{6UOuuMxDZGBAZ@~LywWc1EII%vT>{2F1zR>fiLA-tM zO2F4I;N5?|iHFldG)T@Tix!EI)jOEPrG8ffMWS@6I4#7^{rTj#8Lefj)<-Qah1atN z1iU9EH}ROnphs)VVhifZ0jp9CqUqaL1I-2nyp_V5csLEu+qS7K%PgrYORhJGY6q_d z7FoJfoQ5|?wyZ51ykA%5-jZr@DZK75B;c*Nrm@E)ny-nK$M2Sq*SxC@qEhi|f#hKU z@8D{UJ)DO3awf&fw=b5EJDZrqgx1#rBja?bI1L%(*Rk@I6D8#LRaRSE3a>vO5%BK% zyphKwN;T^*51c#a969}(LA>zXwZOem0dL8>4LzKOcfGXfFDuJ)j`us0c=GLQfk(UR zQgIsIw$QV`toYhFCv5#|7MH^7Rb!x3D;j!CBL3!NS$

XT#%{V%q+7Es*EgfVb#~ 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

A fatal exception has occurred that we could not recover from!

\n" +"

Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

\n" +" " +msgstr "" +"

Pojawił się fatalny wyjątek, którego nie możemy odzyskać!

\n" +"

Aby przesłać zgłoszenie błędu, skorzystaj z poniższych informacji http://github.com/Ultimaker/Cura/issues

\n" +" " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +msgctxt "@action:button" +msgid "Open Web Page" +msgstr "Otwórz stronę sieci Web" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:238 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "Ładowanie drukarki..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:594 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "Ustawianie sceny ..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:636 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "Ładowanie interfejsu ..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:793 +#, python-format +msgctxt "@info" +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(szerokość).1f x %(głębokość).1f x %(wysokość).1f mm" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1263 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "Jednocześnie można załadować tylko jeden plik kodu G. Pominięto import {0}" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1272 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "Nie można otworzyć żadnego innego pliku, jeśli ładuje się kod G. Pominięto import {0}" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:53 +msgctxt "@title" +msgid "Machine Settings" +msgstr "Ustawienia Drukarki" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:71 +msgctxt "@title:tab" +msgid "Printer" +msgstr "Drukarka" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:90 +msgctxt "@label" +msgid "Printer Settings" +msgstr "Ustawienia drukarki" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:102 +msgctxt "@label" +msgid "X (Width)" +msgstr "X (Szerokość)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:135 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:549 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:561 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:574 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:115 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (Głębokość)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (Wysokość)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +msgctxt "@label" +msgid "Build Plate Shape" +msgstr "Konstruuj kształt płyty" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:198 +msgctxt "@option:check" +msgid "Machine Center is Zero" +msgstr "Centrum drukowania jest na zero" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:209 +msgctxt "@option:check" +msgid "Heated Bed" +msgstr "Łóżko podgrzewane" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@label" +msgid "GCode Flavor" +msgstr "Nadać Gkod" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:273 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "Ustawienia głowic drukujących" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:285 +msgctxt "@label" +msgid "X min" +msgstr "X min" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:297 +msgctxt "@label" +msgid "Y min" +msgstr "Y min" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:309 +msgctxt "@label" +msgid "X max" +msgstr "X max" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:321 +msgctxt "@label" +msgid "Y max" +msgstr "Y max" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +msgctxt "@label" +msgid "Gantry height" +msgstr "Wysokość ramy" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:351 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "Liczba dysz" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:379 +msgctxt "@label" +msgid "Material Diameter" +msgstr "Srednica filamentu" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:540 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Rozmiar dyszy:" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:417 +msgctxt "@label" +msgid "Start Gcode" +msgstr "Rozpocznik Gkod" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:446 +msgctxt "@label" +msgid "End Gcode" +msgstr "Koniec Gkodu" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:528 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "Ustawienia dyszy" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:554 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "Korekcja dyszy X" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:567 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "Korekcja dyszyt Y" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:592 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "Extruder Start Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:620 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "Extruder End Gcode" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:20 +msgctxt "@title:window" +msgid "Doodle3D Settings" +msgstr "Ustawienia Doodle3D " + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:53 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +msgctxt "@action:button" +msgid "Save" +msgstr "Zapisać" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:23 +msgctxt "@title:window" +msgid "Print to: %1" +msgstr "Drukuj do: %1" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:40 +msgctxt "@label" +msgid "Extruder Temperature: %1/%2°C" +msgstr "Temperatura dyszy: %1/%2°C" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:45 +msgctxt "@label" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:46 +msgctxt "@label" +msgid "Bed Temperature: %1/%2°C" +msgstr "Temperatura stołu: %1/%2°C" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:64 +msgctxt "@label" +msgid "%1" +msgstr "%1" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:82 +msgctxt "@action:button" +msgid "Print" +msgstr "Wydrukować" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "Zamknij" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:20 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "Aktualizacja firmware" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:40 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "Aktualizacja firmware zakończona" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:45 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "Uruchamianie aktualizacji oprogramowania może potrwać chwilę." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:50 +msgctxt "@label" +msgid "Updating firmware." +msgstr "Aktualizowanie oprogramowania." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:59 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu nieznanego błędu." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:62 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu błędu komunikacji." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:65 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu błędu wejścia / wyjścia." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:68 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu braku oprogramowania firmowego." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:71 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "Nieznany kod błędu: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "Połącz się z drukarką sieciową" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" +"Aby drukować bezpośrednio w drukarce w sieci, upewnij się, że drukarka jest podłączona do sieci przy użyciu kabla sieciowego lub podłączając drukarkę do sieci WIFI. Jeśli nie podłączasz Cury do drukarki, możesz nadal używać dysku USB do przesyłania plików g-code do drukarki.\n" +"\n" +"Wybierz drukarkę z poniższej listy:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "Dodaj" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "Edycja" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:187 +msgctxt "@action:button" +msgid "Remove" +msgstr "Usunąć" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +msgctxt "@action:button" +msgid "Refresh" +msgstr "Odśwież" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 +msgctxt "@label" +msgid "If your printer is not listed, read the network-printing troubleshooting guide" +msgstr "Jeśli drukarka nie ma na liście, przeczytaj o Przewodnik o rozwiązywaniu problemów z drukowaniem sieciowym" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 +msgctxt "@label" +msgid "Type" +msgstr "Rodzaj" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Rozszerzony" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 +msgctxt "@label" +msgid "Unknown" +msgstr "Nieznany" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 +msgctxt "@label" +msgid "Firmware version" +msgstr "Wersja oprogramowania" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 +msgctxt "@label" +msgid "Address" +msgstr "Adres" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "Drukarka pod tym adresem nie odpowiedziała jeszcze." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "Połącz" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "Adres drukarki" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "Wpisz adres IP lub nazwę hosta drukarki w sieci." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 +msgctxt "@action:button" +msgid "Ok" +msgstr "Ok" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "Podłącz do drukarki" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "Załaduj konfigurację drukarki do Cura" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "Uaktywnij konfigurację" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "Wtyczka przetwarzania po przetworzeniu" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "Skrypty po przetworzeniu" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +msgctxt "@action" +msgid "Add a script" +msgstr "Dodaj skrypt" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +msgctxt "@label" +msgid "Settings" +msgstr "Ustawienia" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "Zmień aktywne skrypty post-processingu" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:61 +msgctxt "@label" +msgid "View Mode: Layers" +msgstr "Tryb widoku: warstwy" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:78 +msgctxt "@label" +msgid "Color scheme" +msgstr "Schemat kolorów" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:92 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Kolor materiału" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:96 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Rodzaj linii" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:134 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Tryb zgodności" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:199 +msgctxt "@label" +msgid "Show Travels" +msgstr "Pokaż przejścia" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:205 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Pokaż pomocnik" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:211 +msgctxt "@label" +msgid "Show Shell" +msgstr "Pokaż powłokę" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:217 +msgctxt "@label" +msgid "Show Infill" +msgstr "Pokaż wypełnienie" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:253 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Pokaż tylko najwyższe warstwy" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:262 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Pokaż 5 Szczegółowych Warstw" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:273 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Góra/ Dół" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:277 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Wewnętrzna ściana" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "Konwertuj obraz ..." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "Maksymalna odległość każdego piksela od \"Bazy\"." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "Wysokość (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "Wysokość podstawy z płyty konstrukcyjnej w milimetrach." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "Baza(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "Szerokość w milimetrach na płycie podłoża." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "Szerokość(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "Głębokość w milimetrach na płycie " + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "Głębokość (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh." +msgstr "Domyślnie białe piksele przedstawiają wysokie punkty na siatce, a czarne piksele przedstawiają niskie punkty na siatce. Zmień tę opcję, aby odwrócić takie zachowanie, że czarne piksele przedstawiają wysokie punkty na siatce, a białe piksele przedstawiają niskie punkty na siatce." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "Jaśniejszy jest wyższy" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "Ciemniejsze jest wyższe" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "Ilość wygładzania zastosowana do obrazu." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "Wygładzanie" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:155 +msgctxt "@action:button" +msgid "Select settings" +msgstr "Wybierz ustawienia" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:195 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "Wybierz Ustawienia, aby dostosować ten model" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "Filtr..." + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:243 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "Pokaż wszystko" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +msgctxt "@title:window" +msgid "Open Project" +msgstr "Otwórz projekt" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:57 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "Zaktualizuj istniejące" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "Utwórz nowy" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:69 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "Podsumowanie - Projekt Cura" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:91 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "Ustawienia drukarki" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:107 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "Jak rozwiązywać konflikt w maszynie?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +msgctxt "@action:label" +msgid "Type" +msgstr "Rodzaj/Typ" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:143 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:200 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:292 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +msgctxt "@action:label" +msgid "Name" +msgstr "Nazwa" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:164 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "Ustawienia profilu" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "W jaki sposób rozwiązać konflikt w profilu?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:215 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "Nie w profilu" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:220 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "%1 nadpisanie" +msgstr[1] "%1 Zastępuje" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "Pochodna z:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "%1, %2 nadpisanie" +msgstr[1] "%1, %2 zastępuje" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:252 +msgctxt "@action:label" +msgid "Material settings" +msgstr "Ustawienia materiału" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:268 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "W jaki sposób należy rozwiązać konflikt w materiale?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "Ustaw widoczność" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:320 +msgctxt "@action:label" +msgid "Mode" +msgstr "Tryb" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "Ustawienia widoczne:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%1 poza %2" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:366 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the buildplate" +msgstr "Ładowanie projektu spowoduje wyczyszczenie wszystkich modeli na płycie montażowej" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:385 +msgctxt "@action:button" +msgid "Open" +msgstr "Otwórz" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "Wybierz Aktualizacje drukarki" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "Proszę wybrać dowolne uaktualnienia wykonane w tym Ultimaker 2." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "Olsson Block" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "Zbuduj poziomowanie płyt" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." +msgstr "Aby upewnić się, że wydruki są świetne, można teraz wyregulować płytę montażową. Po kliknięciu przycisku \"Przejdź do następnego położenia\" dysza będzie się poruszać w różnych pozycjach, które można wyregulować." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgstr "Dla każdej pozycji; Włóż kartkę papieru pod dyszę i wyreguluj wysokość płyty. Wysokość blatu drukującego jest prawidłowa, gdy papier jest lekko uchwycony przez końcówkę dyszy." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "Zacznij od wyrównywania poziomu płyt" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "Przejdź do następnego położenia" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "Uaktualnij oprogramowanie firmowe" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work." +msgstr "Oprogramowanie sprzętowe jest częścią oprogramowania działającego bezpośrednio na drukarce 3D. Oprogramowanie to steruje silnikami krokowymi, reguluje temperaturę i ostatecznie sprawia, że drukarka działa." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." +msgstr "Oprogramowanie firmowe dostarczane z nowymi drukarkami działa, ale nowe wersje mają zazwyczaj więcej funkcji i ulepszeń." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "Automatycznie uaktualnij oprogramowanie firmowe" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "Prześlij niestandardowe oprogramowanie firmowe" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "Wybierz niestandardowe oprogramowanie firmowe" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "Proszę wybrać dowolne uaktualnienia wykonane w tym Ultimaker Original" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "Płyta grzewcza podgrzewana (oficjalny zestaw lub samonośny)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "Sprawdź drukarkę" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" +msgstr "Dobrym pomysłem jest zrobienie kilku testów na swoim Ultimakera. Możesz pominąć ten krok, jeśli wiesz, że urządzenie jest funkcjonalne" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "Rozpocznij sprawdzanie drukarki" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "Połączenie:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "Połączono" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "Nie połączono" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +msgctxt "@label" +msgid "Min endstop X: " +msgstr "Min . Krańcówki X: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "Prace" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "Niesprawdzone" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "Min . Krańcówki Y: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "Min . Krańcówki Z: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "Sprawdzanie temperatury dyszy:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "Zatrzymaj ogrzewanie" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "Rozpocznij ogrzewanie" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "Kontrola temperatury płyty konstrukcyjnej:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "Sprawdzanie" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "Wszystko w porządku! Skończono sprawdzenie." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "Nie jest podłączony do drukarki" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:91 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "Drukarka nie akceptuje poleceń" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "W naprawie. Sprawdź drukarkę" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Utracone połączenie z drukarką" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "Drukowanie..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "Wstrzymano" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "Przygotowywanie ..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:112 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "Usuń wydruk" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:238 +msgctxt "@label:" +msgid "Resume" +msgstr "Wznawianie" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:242 +msgctxt "@label:" +msgid "Pause" +msgstr "Wstrzymano" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:271 +msgctxt "@label:" +msgid "Abort Print" +msgstr "Przerwij druk" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:281 +msgctxt "@window:title" +msgid "Abort print" +msgstr "Przerwij druk" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:283 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "Czy na pewno chcesz przerwać drukowanie?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "Odrzuć lub zachowaj zmiany" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "" +"Dostosowyłeś ustawienia profilu.\n" +"Czy chcesz zachować lub usunąć te ustawienia?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "Ustawienia profilu" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "Nieobecny" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "Dostosowane" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:564 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "Zawsze proszę o to" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:565 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "Odrzuć i nigdy nie pytaj" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:566 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "Zachowaj i nigdy nie pytaj ponownie" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "Odrzuć" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "Zachować" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "Utwórz nowy profil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "Informacja" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "Wyświetlana nazwa" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "Marka" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "Typ Materiału" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "Kolor" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "Właściwości" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "Gęstość" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "Średnica" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:171 +msgctxt "@label" +msgid "Filament Cost" +msgstr "Koszt Filamentu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 +msgctxt "@label" +msgid "Filament weight" +msgstr "Waga filamentu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:204 +msgctxt "@label" +msgid "Filament length" +msgstr "Długość Filamentu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:213 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "Koszt na metr" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "Ten materiał jest powiązany z%1 i dzieli się swoimi właściwościami." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:234 +msgctxt "@label" +msgid "Unlink Material" +msgstr "Odłącz materiał" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:245 +msgctxt "@label" +msgid "Description" +msgstr "Opis" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:258 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "Informacje dotyczące przyczepności" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:284 +msgctxt "@label" +msgid "Print settings" +msgstr "Ustawienia drukowania" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "Ustaw widoczność" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "Zaznacz wszystkie" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "Tło/oprawa" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "Profil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "Aktualny" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "Jednostka" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:461 +msgctxt "@title:tab" +msgid "General" +msgstr "Ogólny" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126 +msgctxt "@label" +msgid "Interface" +msgstr "Łącznik" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137 +msgctxt "@label" +msgid "Language:" +msgstr "Język" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:194 +msgctxt "@label" +msgid "Currency:" +msgstr "Waluta:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208 +msgctxt "@label" +msgid "Theme:" +msgstr "Motyw:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 +msgctxt "@item:inlistbox" +msgid "Ultimaker" +msgstr "Ultimaker" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:263 +msgctxt "@label" +msgid "You will need to restart the application for these changes to have effect." +msgstr "Musisz zrestartować aplikację, aby te zmiany zaczęły obowiązywać." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:280 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "Cięcie automatycznie podczas zmiany ustawień." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:288 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "Automatyczne Cięcie" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "Zachowanie w przeglądarce" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:310 +msgctxt "@info:tooltip" +msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." +msgstr "Zaznacz nieobsługiwane obszary modelu na czerwono. Bez wsparcia te obszary nie będą drukowane prawidłowo." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:319 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "Wyświetl zwis" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "Moves the camera so the model is in the center of the view when a model is selected" +msgstr "Przenosi kamerę, aby model był w centrum widoku, gdy wybrano model" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:331 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "Kamera centralna po wybraniu elementu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "Czy domyślne odwzorowanie zoomu cura zostanie odwrócone?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "Odwróć kierunek powiększenia kamery." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved so that they no longer intersect?" +msgstr "Czy modele na platformie powinny być przenoszone w taki sposób, aby nie przecinały się?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:360 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "Upewnij się, że modele są oddzielone" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:368 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "Czy modele na platformie powinny być przemieszczane w dół, aby dotknąć płyty montażowej?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:373 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "Automatycznie upuść modele na płytę konstrukcyjną" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "Pokaż komunikat ostrzegawczy w tekście G-kodu." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "Komunikat ostrzegawczy w tekście G-kodu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:401 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "Czy warstwa powinna być wymuszona w trybie zgodności?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:406 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "Wymuszenie trybu widoku warstw (wymaga ponownego uruchomienia)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:422 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "Otwieranie i zapisywanie plików" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "Czy modele powinny być skalowane do objętości kompilacji, jeśli są zbyt duże?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "Skaluj duże modele" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442 +msgctxt "@info:tooltip" +msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?" +msgstr "Model może wydawać się bardzo mały, jeśli jego jednostka jest na przykład w metrach, a nie w milimetrach. Czy modele powinny być skalowane?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:447 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "Skaluj bardzo małe modele" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456 +msgctxt "@info:tooltip" +msgid "Should a prefix based on the printer name be added to the print job name automatically?" +msgstr "Czy przedrostek oparty na nazwie drukarki zostanie automatycznie dodany do nazwy zadania drukowania?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "Dodaj przedrostek maszyny do nazwy zadania" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:470 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "Czy należy podsumować podczas zapisywania pliku projektu?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:474 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "Pokaż okno dialogowe podsumowania przy zapisywaniu projektu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "Domyślne zachowanie podczas otwierania pliku projektu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "Domyślne zachowanie podczas otwierania pliku projektu:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:504 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "Zawsze pytaj" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "Zawsze otwieraj jako projekt" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "Zawsze importuj modele" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542 +msgctxt "@info:tooltip" +msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgstr "Po wprowadzeniu zmian w profilu i przechodzeniu na inny użytkownik zostanie wyświetlone okno dialogowe z pytaniem, czy chcesz zachować swoje modyfikacje, czy nie, lub możesz wybrać domyślne zachowanie i nigdy nie wyświetlać tego dialogu." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:551 +msgctxt "@label" +msgid "Override Profile" +msgstr "Zastąp profil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:600 +msgctxt "@label" +msgid "Privacy" +msgstr "Prywatność" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:607 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "Czy Cura ma sprawdzać aktualizacje podczas uruchamiania programu?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:612 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "Sprawdź, czy są aktualizacje na początku" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:622 +msgctxt "@info:tooltip" +msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored." +msgstr "Czy anonimowe dane o wydruku zostaną przesłane do firmy Ultimaker? Uwaga, nie są wysyłane ani przechowywane żadne modele, adresy IP ani inne dane umożliwiające identyfikację użytkownika." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:627 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr "Wyślij informacje o drukowaniu (anonimowym)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:466 +msgctxt "@title:tab" +msgid "Printers" +msgstr "Drukarki" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "Aktywuj" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "Zmień nazwę" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +msgctxt "@label" +msgid "Printer type:" +msgstr "Typ drukarki:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +msgctxt "@label" +msgid "Connection:" +msgstr "Połączenie:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "Drukarka nie jest podłączona." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +msgctxt "@label" +msgid "State:" +msgstr "Stan:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "Wyczyść stół" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "Oczekiwanie na zadanie drukowania" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:470 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "Profile" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "Chronione profile" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "Profile niestandardowe" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "Stwórz" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "Duplikuj" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:194 +msgctxt "@action:button" +msgid "Import" +msgstr "Import" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Export" +msgstr "Export" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "Drukarka: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "Aktualizuj profil z bieżącymi ustawieniami / nadpisaniem" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "Odrzuć bieżące zmiany" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." +msgstr "Ten profil używa ustawień domyślnych określonych przez drukarkę, dlatego nie ma żadnych ustawień / zastąpień na poniższej liście." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "Aktualne ustawienia odpowiadają wybranemu profilowi." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "Ustawienia ogólne" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "Zmień nazwę profilu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "Stwórz profil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "Duplikat profilu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "Import Profilu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "Import Profilu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "Export Profilu" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:468 +msgctxt "@title:tab" +msgid "Materials" +msgstr "Materiał" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" +msgid "Printer: %1, %2: %3" +msgstr "Drukarka: %1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "Drukarka: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:148 +msgctxt "@action:button" +msgid "Create" +msgstr "Stwórz" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:166 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "Duplicat" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:295 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:303 +msgctxt "@title:window" +msgid "Import Material" +msgstr "Importuj Materiał" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:304 +msgctxt "@info:status" +msgid "Could not import material %1: %2" +msgstr "Nie można zaimportować materiału %1: %2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:308 +msgctxt "@info:status" +msgid "Successfully imported material %1" +msgstr "Pomyślnie zaimportowano materiał %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:327 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:342 +msgctxt "@title:window" +msgid "Export Material" +msgstr "Export Materiału" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:346 +msgctxt "@info:status" +msgid "Failed to export material to %1: %2" +msgstr "Nie udało się wyeksportować materiałów do %1: %2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:352 +msgctxt "@info:status" +msgid "Successfully exported material to %1" +msgstr "Udało się wyeksportować materiał do %1" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:783 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "Dodaj drukarkę..." + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "Nazwa drukarki:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "Dodaj drukarkę" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:179 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "Zewnętrzna ściana" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:180 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "Ściany wewnętrzne" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:181 +msgctxt "@tooltip" +msgid "Skin" +msgstr "poszycie zewnętrzne" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:182 +msgctxt "@tooltip" +msgid "Infill" +msgstr "Wypełnienie" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:183 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "Wypełnienie podpór " + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:184 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "Łącznenie podpór " + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:185 +msgctxt "@tooltip" +msgid "Support" +msgstr "Wsparcie/Podpory " + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:186 +msgctxt "@tooltip" +msgid "Travel" +msgstr "Przejazdy" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:187 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "Retrakcja" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:188 +msgctxt "@tooltip" +msgid "Other" +msgstr "Inny" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:215 +msgctxt "@label" +msgid "00h 00min" +msgstr "00h 00min" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:268 +msgctxt "@label" +msgid "%1 m / ~ %2 g / ~ %4 %3" +msgstr "%1 m / ~ %2 g / ~ %4 %3" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:273 +msgctxt "@label" +msgid "%1 m / ~ %2 g" +msgstr "%1 m / ~ %2 g" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "O Cura3d" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "Kompletne rozwiązanie do druku trójwymiarowego z włókna ciągłego." + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "" +"Cura jest rozwijana przez firmę Ultimaker B.V. we współpracy ze społecznością.\n" +"Cura z dumą korzysta z następujących projektów open source:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "Graficzny interfejs użytkownika" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "Struktura aplikacji" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "GCode generator" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "Biblioteka komunikacyjna międzyprocesowa" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "Język programowania" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "Struktura GUI " + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "Wiązania struktury GUI" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "C/C++biblioteka" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "Format wymiany danych" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing " +msgstr "Biblioteka wsparcia dla komputerów naukowych" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "Biblioteka pomocy dla szybszej matematyki" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "Wsparcie biblioteki do obsługi plików STL" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "Obsługa biblioteki do obsługi plików 3MF" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "Biblioteka komunikacji szeregowej" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "Biblioteka wykrywania ZeroConf" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "Biblioteka przycinająca wielokątów" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +msgctxt "@label" +msgid "Font" +msgstr "Czcionka" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "SVG icons" +msgstr "SVG ikony" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:60 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "Szukanie..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:337 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "Skopiuj wartość do wszystkich wytłaczarek" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:352 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "Ukryj to ustawienie" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:362 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "Nie pokazuj tego ustawienia" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:366 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "Utrzymaj to ustawienie" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:385 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "Skonfiguruj widoczne ustawienia ..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:93 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated value.\n" +"\n" +"Click to make these settings visible." +msgstr "" +"Niektóre ukryte ustawienia używają wartości różniących się od ich normalnej wartości obliczonej.\n" +"\n" +"Kliknij, aby te ustawienia były widoczne." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:60 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "Wpłynąć" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:65 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "Pod wpływem" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:155 +msgctxt "@label" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +msgstr "To ustawienie jest zawsze dzielone między wszystkie wytłaczarki. Zmiana tutaj zmieni wartość dla wszystkich wytłaczarek" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:158 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "Wartość jest rozdzielana z wartości dla każdego wytłaczarki" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:184 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" +"To ustawienie ma inną wartość niż profil.\n" +"\n" +"Kliknij, aby przywrócić wartość profilu." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:282 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" +"To ustawienie jest zwykle obliczane, ale obecnie ma wartość bezwzględną.\n" +"\n" +"Kliknij, aby przywrócić wartość obliczoną." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:185 +msgctxt "@tooltip" +msgid "Print Setup

Edit or review the settings for the active print job." +msgstr "Ustawienia drukowania

Edytuj lub przejrzyj ustawienia dla aktywnego zadania drukowania." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:284 +msgctxt "@tooltip" +msgid "Print Monitor

Monitor the state of the connected printer and the print job in progress." +msgstr "Monitor wydruku

Monitorowanie stanu podłączonej drukarki i zadania drukowania w toku." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:337 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "Ustawienia drukowania" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:337 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "" +"Konfiguracja wydruku jest wyłączona\n" +"G-kod nie można zmodyfikować plików" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:644 +msgctxt "@tooltip" +msgid "Recommended Print Setup

Print with the recommended settings for the selected printer, material and quality." +msgstr "Zalecana konfiguracja wydruku

Drukowanie z zalecanymi ustawieniami dla wybranej drukarki, materiału i jakości." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:649 +msgctxt "@tooltip" +msgid "Custom Print Setup

Print with finegrained control over every last bit of the slicing process." +msgstr "Niestandardowa konfiguracja wydruku

Drukowanie z precyzyjną kontrolą nad każdym ostatnim krokiem procesu krojenia." + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "Automatyczny: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "&Widok" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +msgctxt "@title:menuitem %1 is the value from the printer" +msgid "Automatic: %1" +msgstr "Automatyczny: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "Wydrukuj wybrane modele:" +msgstr[1] "Wydrukuj wybrane modele:" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:82 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "Pomnożyć wybrany model" +msgstr[1] "Pomnożyć wybrany modele" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:109 +msgctxt "@label" +msgid "Number of Copies" +msgstr "Liczba kopii" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "Otwórz&ostatnio używane" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "Nie podłączono drukarki" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +msgctxt "@label" +msgid "Hotend" +msgstr "Blok grzejny/hotend" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:119 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "Bieżąca temperatura głowicy drukującej" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:154 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "Kolor materiału w tej wytłaczarce." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:186 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "Materiał w głowicy drukującej." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:218 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "Dysza włożona do tej głowicy drukującej." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:249 +msgctxt "@label" +msgid "Build plate" +msgstr "Płyta/Stół" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:278 +msgctxt "@tooltip" +msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." +msgstr "Temperatura docelowa podgrzanego stołu. Stół rozgrzeje się lub ochłodzi w kierunku tej temperatury. Jeśli jest 0, grzanie stołu jest wyłączone." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:310 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "Bieżąca temperatura ogrzewanego stołu." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:379 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "Temperatura do wstępnego podgrzewania stołu." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:573 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "Anuluj" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:573 +msgctxt "@button" +msgid "Pre-heat" +msgstr "Podgrzewanie wstępne" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:600 +msgctxt "@tooltip of pre-heat" +msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." +msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosować druk podczas nagrzewania i nie musisz czekać, aż stół będzie się rozgrzewać, gdy będziesz gotowy do drukowania." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:633 +msgctxt "@label" +msgid "Active print" +msgstr "Aktywny wydruk" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:638 +msgctxt "@label" +msgid "Job Name" +msgstr "Nazwa pracy" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +msgctxt "@label" +msgid "Printing Time" +msgstr "Czas druku" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 +msgctxt "@label" +msgid "Estimated time left" +msgstr "Szacowany czas pozostały" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "Przełącz tryb pełnoekranowy" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "&Cofnij" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "&Ponów" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "&Wyjść" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "Konfiguruj Cura ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "&Dodaj drukarkę ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "Zarządzaj drukarkami ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "Zarządzaj materiałami ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "&Aktualizuj profil z bieżącymi ustawieniami/przesłonami" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "&Odrzuć bieżące zmiany" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "&Utwórz profil z bieżących ustawień/nadpisań ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "Zarządzaj profilami ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "Pokaż dokumentację internetową" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "Zgłoś błąd" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "&Temat" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "Usuń & wybrany model" +msgstr[1] "Usuń & wybrany modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "Centrum wybranego modelu" +msgstr[1] "Centrum wybranego modeli" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "Pomnożyć wybrany model" +msgstr[1] "Pomnożyć wybrany modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "Usuń model" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "Centruj model na platformie" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "&Modele grupowe" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "Modele grup " + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "&Połącz modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "&Powielić modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "&Wybierz wszystkie modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "&Wyczyść stół" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "Odśwież wszystkie modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "Ułóż wszystkie modele" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "Zorganizuj wybór" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "Zresetuj wszystkie pozycje modelu" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "Zresetuj wszystkie modele i transformacje" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "&Otwórz pliki ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "&Nowy projekt..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "Pokaż silnik &dziennik ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "Pokaż folder konfiguracji" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "Skonfiguruj widoczność ustawień ..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:27 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3d model" +msgstr "Proszę załaduj model 3d" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:33 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "Gotowy do wycinania" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:35 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "Cięcie..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:37 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "Gotowy do %1" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:39 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "Nie można zgrać" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:41 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "Krojenie niedostępne" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:148 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "Przygotować" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:148 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "Anuluj" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:288 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "Wybierz aktywne urządzenie wyjściowe" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:618 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "Otwórz plik(i)" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?" +msgstr "Znaleziono jeden lub więcej plików projektu w wybranych plikach. Możesz otwierać tylko jeden plik projektu na raz. Proponujemy tylko importowanie modeli z tych plików. Chcesz kontynuować?" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "Importuj wszystkie jako modele" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Cura" +msgstr "Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:68 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "&Plik" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "&Zapisz wybór w pliku" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:94 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "Zapisz &jako..." + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:105 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "Zapisz projekt" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "&Edytuj" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Widok" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:150 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "&Ustawienia" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:152 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "&Drukarka" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:174 +msgctxt "@title:menu" +msgid "&Material" +msgstr "&Materiał" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "&Profile" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "Ustaw jako aktywną głowice drukującą" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:185 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "&Rozszerzenia" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:218 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "Preferencje" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:226 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "&Pomoc" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:296 +msgctxt "@action:button" +msgid "Open File" +msgstr "Otwórz plik" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:369 +msgctxt "@action:button" +msgid "View Mode" +msgstr "Tryb podglądu" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:464 +msgctxt "@title:tab" +msgid "Settings" +msgstr "Ustawienia" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:500 +msgctxt "@title:window" +msgid "New project" +msgstr "Nowy projekt" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:501 +msgctxt "@info:question" +msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." +msgstr "Czy na pewno chcesz rozpocząć nowy projekt? Spowoduje to wyczyszczenie stołu i niezapisanych ustawień." + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:718 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "Otwórz plik(i)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +msgctxt "@text:window" +msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." +msgstr "Znaleziono jeden lub więcej plików G-kod w wybranych plikach. Możesz otwierać tylko jeden plik G-kod jednocześnie. Jeśli chcesz otworzyć plik G-kod, wystarczy wybrać tylko jeden." + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "Zapisz projekt" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "Głowica drukująca %1" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "%1 & materiał" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "Nie pokazuj podsumowania projektu w celu zapisania" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:41 +msgctxt "@label" +msgid "Infill" +msgstr "Wypełnienie" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:188 +msgctxt "@label" +msgid "0%" +msgstr "0%" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:195 +msgctxt "@label" +msgid "Empty infill will leave your model hollow with low strength." +msgstr "Pusty wkład wypełnia pusty model." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:199 +msgctxt "@label" +msgid "20%" +msgstr "20%" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:206 +msgctxt "@label" +msgid "Light (20%) infill will give your model an average strength." +msgstr "Lekki (20%) wypełnienie sprawi, że model będzie średniej wytrzymałości." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:210 +msgctxt "@label" +msgid "50%" +msgstr "50%" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:217 +msgctxt "@label" +msgid "Dense (50%) infill will give your model an above average strength." +msgstr "Gęste wypełnienie (50%) da modelowi wyższą średnią wytrzymałość." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:221 +msgctxt "@label" +msgid "100%" +msgstr "100%" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:228 +msgctxt "@label" +msgid "Solid (100%) infill will make your model completely solid." +msgstr "Solidny (100%) wypełnienie sprawi, że model będzie solidny." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:232 +msgctxt "@label" +msgid "Gradual" +msgstr "Stopniowy" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:240 +msgctxt "@label" +msgid "Gradual infill will gradually increase the amount of infill towards the top." +msgstr "Stopniowe wypełnienie stopniowo zwiększa ilość wypełnień w górę." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:263 +msgctxt "@label" +msgid "Generate Support" +msgstr "Wygeneruj podpory" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:296 +msgctxt "@label" +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "Generowanie struktur wspierających części modelu, które mają zwis. Bez tych struktur takie części mogłyby spaść podczas drukowania." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:313 +msgctxt "@label" +msgid "Support Extruder" +msgstr "Wytłaczarka wspomagająca" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:387 +msgctxt "@label" +msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." +msgstr "Wybrać, którą wytłaczarkę użyć do podparcia. Powoduje to tworzenie struktur wspierających poniżej modelu, aby zapobiec spadaniu lub drukowaniu modelu w powietrzu." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:412 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "Zbuduj przyczepnośćdo stołu" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:458 +msgctxt "@label" +msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgstr "Włącz drukowanie obrysu lub tratwy. Spowoduje to dodanie płaskiej powierzchni wokół lub pod Twoim obiektem, która jest łatwa do wycinania później." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:511 +msgctxt "@label" +msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" +msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
PrzeczytaćInstrukcje dotyczące rozwiązywania problemów z Ultimaker" + +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models With %1" +msgstr[0] "Wydrukuj wybrany model z %1" +msgstr[1] "Wydrukuj wybrany modele z %1" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "Otwórz plik projektu" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +msgctxt "@text:window" +msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" +msgstr "Jest to plik projektu Cura. Czy chcesz otworzyć go jako projekt lub zaimportować z niego modele?" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Zapamiętaj mój wybór" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +msgctxt "@action:button" +msgid "Open as project" +msgstr "Otwórz jako projekt" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +msgctxt "@action:button" +msgid "Import models" +msgstr "Importuj modele" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "Dziennik silnika" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:193 +msgctxt "@label" +msgid "Material" +msgstr "Materiał" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:234 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "Kliknij, aby sprawdzić zgodność materiału z Ultimaker.com." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:321 +msgctxt "@label" +msgid "Profile:" +msgstr "Profile:" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" +"Niektóre wartości ustawień / nadpisywania różnią się od wartości zapisanych w profilu.\n" +"\n" +"Kliknij, aby otworzyć menedżera profili." diff --git a/resources/i18n/pl/fdmextruder.def.json.po b/resources/i18n/pl/fdmextruder.def.json.po new file mode 100644 index 0000000000..6f1d548bcd --- /dev/null +++ b/resources/i18n/pl/fdmextruder.def.json.po @@ -0,0 +1,174 @@ +msgid "" +msgstr "" +"Project-Id-Version: Cura 2.6\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-05-30 15:32+0000\n" +"PO-Revision-Date: 2017-07-13 16:08+0200\n" +"Last-Translator: Bothof \n" +"Language-Team: German\n" +"Language: de\n" +"Lang-Code: de\n" +"Country-Code: DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" + +msgctxt "extruder_nr description" +msgid "The extruder train used for printing. This is used in multi-extrusion." +msgstr "" +"Urządzenie do drukowania stosuje się głowicę drukującą. Służy do multi-" +"ekstruzji." + +msgctxt "extruder_nr label" +msgid "Extruder" +msgstr "Extruder" + +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "" +"Die X-Koordinate der Position, an der die Düse am Druckbeginn einzieht." + +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "X-Position Extruder-Einzug" + +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "" +"Die Y-Koordinate der Position, an der die Düse am Druckbeginn einzieht." + +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "Y-Position Extruder-Einzug" + +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "" +"Die Z-Koordinate der Position, an der die Düse am Druckbeginn einzieht." + +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "Z-Position Extruder-Einzug" + +msgctxt "machine_extruder_end_code description" +msgid "End g-code to execute whenever turning the extruder off." +msgstr "Beenden Sie den G-Code jedes Mal, wenn Sie den Extruder ausschalten." + +msgctxt "machine_extruder_end_code label" +msgid "Extruder End G-Code" +msgstr "G-Code Extruder-Ende" + +msgctxt "machine_extruder_end_pos_abs description" +msgid "" +"Make the extruder ending position absolute rather than relative to the last-" +"known location of the head." +msgstr "" +"Bevorzugen Sie eine absolute Endposition des Extruders anstelle einer " +"relativen Position zur zuletzt bekannten Kopfposition." + +msgctxt "machine_extruder_end_pos_abs label" +msgid "Extruder End Position Absolute" +msgstr "Pozycja końca absolutnym głowicy drukującej" + +msgctxt "machine_extruder_end_pos_x description" +msgid "The x-coordinate of the ending position when turning the extruder off." +msgstr "Die X-Koordinate der Endposition beim Ausschalten des Extruders." + +msgctxt "machine_extruder_end_pos_x label" +msgid "Extruder End Position X" +msgstr "Extruder-Endposition X" + +msgctxt "machine_extruder_end_pos_y description" +msgid "The y-coordinate of the ending position when turning the extruder off." +msgstr "Die Y-Koordinate der Endposition beim Ausschalten des Extruders." + +msgctxt "machine_extruder_end_pos_y label" +msgid "Extruder End Position Y" +msgstr "Extruder-Endposition Y" + +msgctxt "machine_extruder_start_code description" +msgid "Start g-code to execute whenever turning the extruder on." +msgstr "Zacznij każdym razem, gdy G-kod po włączeniu wytłaczarki." + +msgctxt "machine_extruder_start_code label" +msgid "Extruder Start G-Code" +msgstr "G-kodu startowego głowicy drukującej" + +msgctxt "machine_extruder_start_pos_abs description" +msgid "" +"Make the extruder starting position absolute rather than relative to the " +"last-known location of the head." +msgstr "" +"Bevorzugen Sie eine absolute Startposition des Extruders anstelle einer " +"relativen Position zur zuletzt bekannten Kopfposition." + +msgctxt "machine_extruder_start_pos_abs label" +msgid "Extruder Start Position Absolute" +msgstr "Absolutną pozycję wyjściową wytłaczarki" + +msgctxt "machine_extruder_start_pos_x description" +msgid "The x-coordinate of the starting position when turning the extruder on." +msgstr "Die X-Koordinate der Startposition beim Einschalten des Extruders." + +msgctxt "machine_extruder_start_pos_x label" +msgid "Extruder Start Position X" +msgstr "X-Position Extruder-Start" + +msgctxt "machine_extruder_start_pos_y description" +msgid "The y-coordinate of the starting position when turning the extruder on." +msgstr "Die Y-Koordinate der Startposition beim Einschalten des Extruders." + +msgctxt "machine_extruder_start_pos_y label" +msgid "Extruder Start Position Y" +msgstr "Y-Position Extruder-Start" + +msgctxt "machine_nozzle_offset_x description" +msgid "The x-coordinate of the offset of the nozzle." +msgstr "Współrzędnej X podziałki dysz." + +msgctxt "machine_nozzle_offset_x label" +msgid "Nozzle X Offset" +msgstr "X przesunięcie dyszy" + +msgctxt "machine_nozzle_offset_y description" +msgid "The y-coordinate of the offset of the nozzle." +msgstr "Współrzędnej Y podziałki dysz." + +msgctxt "machine_nozzle_offset_y label" +msgid "Nozzle Y Offset" +msgstr "Y przesunięcie dyszę" + +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "" +"Wewnętrzna średnica dyszy. Użyj tego ustawienia, jeśli używasz dyszę o " +"niestandardowym rozmiarze." + +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "średnica dyszy" + +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "Ustawienia specyficzne dla urządzenia" + +msgctxt "machine_settings label" +msgid "Machine" +msgstr "urządzenie" + +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "odpowiedzialność" + +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "Druckplattenhaftung" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po new file mode 100644 index 0000000000..f1fadf0bad --- /dev/null +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -0,0 +1,4917 @@ +msgid "" +msgstr "" +"Project-Id-Version: Cura 2.6\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-05-30 15:32+0000\n" +"PO-Revision-Date: 2017-07-17 01:20+0200\n" +"Last-Translator: Bothof \n" +"Language-Team: German\n" +"Language: de\n" +"Lang-Code: de\n" +"Country-Code: DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" + +msgctxt "acceleration_enabled description" +msgid "" +"Enables adjusting the print head acceleration. Increasing the accelerations " +"can reduce printing time at the cost of print quality." +msgstr "" +"Umożliwia regulację przyspieszenia głowicy drukującej. Wzrost przyspieszeń " +"może skrócić czas drukowania kosztem jakości druku." + +msgctxt "acceleration_enabled label" +msgid "Enable Acceleration Control" +msgstr "Włącz sterowanie przyspieszeniem" + +msgctxt "acceleration_infill description" +msgid "The acceleration with which infill is printed." +msgstr "Przyspieszenie z którym wypełnienie jest drukowane." + +msgctxt "acceleration_infill label" +msgid "Infill Acceleration" +msgstr "Przyspieszenie wypełnienia" + +msgctxt "acceleration_layer_0 description" +msgid "The acceleration for the initial layer." +msgstr "Przyspieszenie dla początkowej warstwy." + +msgctxt "acceleration_layer_0 label" +msgid "Initial Layer Acceleration" +msgstr "Pierwsza warstwa przyspieszenie" + +msgctxt "acceleration_prime_tower description" +msgid "The acceleration with which the prime tower is printed." +msgstr "Przyspieszenie, z którym drukowana jest pierwszorzędna wieża." + +msgctxt "acceleration_prime_tower label" +msgid "Prime Tower Acceleration" +msgstr "Przyspieszenie pierwszorzędnej wieży." + +msgctxt "acceleration_print description" +msgid "The acceleration with which printing happens." +msgstr "Przyspieszenie, z jakim odbywa się drukowanie." + +msgctxt "acceleration_print label" +msgid "Print Acceleration" +msgstr "Przyspieszenie druku (Acceleration)" + +msgctxt "acceleration_print_layer_0 description" +msgid "The acceleration during the printing of the initial layer." +msgstr "Przyspieszenie podczas drukowania pierwszej warstwy." + +msgctxt "acceleration_print_layer_0 label" +msgid "Initial Layer Print Acceleration" +msgstr "Początkowe przyspieszenie drukowania warstw" + +msgctxt "acceleration_skirt_brim description" +msgid "" +"The acceleration with which the skirt and brim are printed. Normally this is " +"done with the initial layer acceleration, but sometimes you might want to " +"print the skirt or brim at a different acceleration." +msgstr "" +"Przyspieszenia, z którymi Skirt- i brzegi-elementy druku. Typowo, następuje " +"przyspieszenie warstwy bazowej używany. W niektórych przypadkach może być " +"korzystne, jednak, aby wydrukować Skirt- lub Brim elementu z innym " +"przyspieszenia." + +msgctxt "acceleration_skirt_brim label" +msgid "Skirt/Brim Acceleration" +msgstr "Przyspieszenie Skirt / Brim" + +msgctxt "acceleration_support description" +msgid "The acceleration with which the support structure is printed." +msgstr "Przyspieszenie z której konstrukcja nośna jest drukowana." + +msgctxt "acceleration_support label" +msgid "Support Acceleration" +msgstr "Konstrukcja podpór przyspieszenie" + +msgctxt "acceleration_support_bottom description" +msgid "" +"The acceleration with which the floors of support are printed. Printing them " +"at lower acceleration can improve adhesion of support on top of your model." +msgstr "" +"Przyspieszenie, z jakim są drukowane podłoża. Drukowanie przy niższym " +"przyspieszeniu może poprawić adhezję wsparcia nad modelem." + +msgctxt "acceleration_support_bottom label" +msgid "Support Floor Acceleration" +msgstr "Przyspieszenie struktury podłoża" + +msgctxt "acceleration_support_infill description" +msgid "The acceleration with which the infill of support is printed." +msgstr "" +"Przyspieszenie z których wypełnienie konstrukcji nośnej jest drukowane." + +msgctxt "acceleration_support_infill label" +msgid "Support Infill Acceleration" +msgstr "Przyspieszenie struktury wsparcia wypełnienia." + +msgctxt "acceleration_support_interface description" +msgid "" +"The acceleration with which the roofs and floors of support are printed. " +"Printing them at lower acceleration can improve overhang quality." +msgstr "" +"Przyspieszenie, z jaką są drukowane dachy i podłogi podpory. Drukowanie przy " +"niższym przyspieszeniu może poprawić jakość zwisu." + +msgctxt "acceleration_support_interface label" +msgid "Support Interface Acceleration" +msgstr "Przyspieszenie interfejs konstrukcja nośna" + +msgctxt "acceleration_support_roof description" +msgid "" +"The acceleration with which the roofs of support are printed. Printing them " +"at lower acceleration can improve overhang quality." +msgstr "" +"Przyspieszenia, z którymi dachów konstrukcji nośnej do wydrukowania. " +"Drukując na niższym przyspieszeniem, jakość wystające może być poprawiona." + +msgctxt "acceleration_support_roof label" +msgid "Support Roof Acceleration" +msgstr "Konstrukcja dachu przyspieszenie" + +msgctxt "acceleration_topbottom description" +msgid "The acceleration with which top/bottom layers are printed." +msgstr "Przyspieszenie w którym górne / dolne warstwy druku." + +msgctxt "acceleration_topbottom label" +msgid "Top/Bottom Acceleration" +msgstr "Przyspieszenie w górę / w dół" + +msgctxt "acceleration_travel description" +msgid "The acceleration with which travel moves are made." +msgstr "Przyspieszenie, z jaką wykonywane są przemieszczenia." + +msgctxt "acceleration_travel label" +msgid "Travel Acceleration" +msgstr "Przyspieszenie podróży" + +msgctxt "acceleration_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "Przyspieszenie ruchu napędu pierwszej warstwy." + +msgctxt "acceleration_travel_layer_0 label" +msgid "Initial Layer Travel Acceleration" +msgstr "Prędkość ruchu dla pierwszej warstwy" + +msgctxt "acceleration_wall description" +msgid "The acceleration with which the walls are printed." +msgstr "Przyspieszenie z którym ściany są drukowane." + +msgctxt "acceleration_wall label" +msgid "Wall Acceleration" +msgstr "Przyspieszenie ściany" + +msgctxt "acceleration_wall_0 description" +msgid "The acceleration with which the outermost walls are printed." +msgstr "Przyspieszenia, z którym ściany zewnętrzne są drukowane." + +msgctxt "acceleration_wall_0 label" +msgid "Outer Wall Acceleration" +msgstr "Przyspieszenie zewnętrzna ściana" + +msgctxt "acceleration_wall_x description" +msgid "The acceleration with which all inner walls are printed." +msgstr "Przyspieszenie z których wewnętrzne ścianki są drukowane." + +msgctxt "acceleration_wall_x label" +msgid "Inner Wall Acceleration" +msgstr "Przyspieszenie wewnętrzna ściana" + +msgctxt "adhesion_extruder_nr description" +msgid "" +"The extruder train to use for printing the skirt/brim/raft. This is used in " +"multi-extrusion." +msgstr "" +"Element wytłaczarki do drukowania Obwódki / Obrzeża / Tratwy. Służy do multi-" +"ekstruzji." + +msgctxt "adhesion_extruder_nr label" +msgid "Build Plate Adhesion Extruder" +msgstr "Wytłaczarka do wytłaczania płyt warstwowych" + +msgctxt "adhesion_type description" +msgid "" +"Different options that help to improve both priming your extrusion and " +"adhesion to the build plate. Brim adds a single layer flat area around the " +"base of your model to prevent warping. Raft adds a thick grid with a roof " +"below the model. Skirt is a line printed around the model, but not connected " +"to the model." +msgstr "" +"Różne opcje, które pomogą poprawić zarówno wypalanie wytłoczenia, jak i " +"przyczepność do płytki. Brim dodaje jednowarstwową płaską powierzchnię wokół " +"podstawy modelu, aby zapobiec wypaczeniu. Raft dodaje grubą siatkę z dachem " +"poniżej modelu. Spódnica to linia nadrukowana wokół modelu, ale nie " +"połączona z modelem." + +msgctxt "adhesion_type label" +msgid "Build Plate Adhesion Type" +msgstr "Podaj typ przyczepności płyty" + +msgctxt "adhesion_type option brim" +msgid "Brim" +msgstr "Obrzeże/Brim" + +msgctxt "adhesion_type option none" +msgid "None" +msgstr "Żaden" + +msgctxt "adhesion_type option raft" +msgid "Raft" +msgstr "Tratwa" + +msgctxt "adhesion_type option skirt" +msgid "Skirt" +msgstr "Obwódka/Skirt" + +msgctxt "alternate_carve_order description" +msgid "" +"Switch to which mesh intersecting volumes will belong with every layer, so " +"that the overlapping meshes become interwoven. Turning this setting off will " +"cause one of the meshes to obtain all of the volume in the overlap, while it " +"is removed from the other meshes." +msgstr "" +"Przełączanie, w które będą się przecinały siatki, będą przychodzić z każdą " +"warstwą, tak, aby zachodzące na siebie siatki się wzajemnie splatały. " +"Wyłączenie tej opcji spowoduje, że jeden z oczek będzie mógł pobrać całą " +"objętość na zakładce, podczas gdy jest usuwany z innych oczek." + +msgctxt "alternate_carve_order label" +msgid "Alternate Mesh Removal" +msgstr "Zmiana usunięcie sieci" + +msgctxt "alternate_extra_perimeter description" +msgid "" +"Prints an extra wall at every other layer. This way infill gets caught " +"between these extra walls, resulting in stronger prints." +msgstr "" +"W ten sposób wypełnienie zostaje złapane między tymi dodatkowymi ścianami, " +"powodując silniejsze odruchy." + +msgctxt "alternate_extra_perimeter label" +msgid "Alternate Extra Wall" +msgstr "Alternatywna dodatkowa ściana" + +msgctxt "anti_overhang_mesh description" +msgid "" +"Use this mesh to specify where no part of the model should be detected as " +"overhang. This can be used to remove unwanted support structure." +msgstr "" +"Sieć ta służy do określenia, która część modelu ma być rozpoznany jako zwis. " +"Może być stosowany do usuwania niechcianych konstrukcję nośną." + +msgctxt "anti_overhang_mesh label" +msgid "Anti Overhang Mesh" +msgstr "Anti-zwis sieć" + +msgctxt "blackmagic description" +msgid "category_blackmagic" +msgstr "Czarna magia kategorii" + +msgctxt "blackmagic label" +msgid "Special Modes" +msgstr "Specjalne tryby" + +msgctxt "bottom_layers description" +msgid "" +"The number of bottom layers. When calculated by the bottom thickness, this " +"value is rounded to a whole number." +msgstr "" +"Liczba warstw dolnych. Przy obliczaniu dolnej grubości ta wartość jest " +"zaokrąglana do liczby całkowitej." + +msgctxt "bottom_layers label" +msgid "Bottom Layers" +msgstr "Dolne warstwy" + +msgctxt "bottom_thickness description" +msgid "" +"The thickness of the bottom layers in the print. This value divided by the " +"layer height defines the number of bottom layers." +msgstr "" +"Grubość dolnych warstw w druku. Ta wartość podzielona przez wysokość warstwy " +"definiuje liczbę warstw dolnych." + +msgctxt "bottom_thickness label" +msgid "Bottom Thickness" +msgstr "Redukcja grubości" + +msgctxt "brim_line_count description" +msgid "" +"The number of lines used for a brim. More brim lines enhance adhesion to the " +"build plate, but also reduces the effective print area." +msgstr "" +"Liczba linii dla elementu obrzeży. Większa liczba obrzeży linii poprawia " +"przyczepność do stołu ale to również zmniejsza powierzchnię użytkową druku." + +msgctxt "brim_line_count label" +msgid "Brim Line Count" +msgstr "Liczba linii obrzeża" + +msgctxt "brim_outside_only description" +msgid "" +"Only print the brim on the outside of the model. This reduces the amount of " +"brim you need to remove afterwards, while it doesn't reduce the bed adhesion " +"that much." +msgstr "" +"Obrzeże drukować tylko na zewnątrz modelu. Daje to liczbę ronda, które " +"trzeba usunąć później, podczas drukowania pole stołu jest znacznie " +"ograniczone zmniejszone." + +msgctxt "brim_outside_only label" +msgid "Brim Only on Outside" +msgstr "Obrzeża tylko na zewnątrz" + +msgctxt "brim_width description" +msgid "" +"The distance from the model to the outermost brim line. A larger brim " +"enhances adhesion to the build plate, but also reduces the effective print " +"area." +msgstr "" +"Odległość od modelu do najbardziej wysuniętej na zewnątrz linii. Większy " +"obwód zwiększa adhezję do płytki, ale również zmniejsza efektywny obszar " +"wydruku." + +msgctxt "brim_width label" +msgid "Brim Width" +msgstr "Szerokość Obrzeża/Brim" + +msgctxt "carve_multiple_volumes description" +msgid "" +"Remove areas where multiple meshes are overlapping with each other. This may " +"be used if merged dual material objects overlap with each other." +msgstr "" +"Obszarach poza, w którym wiele sieci pokrywają się ze sobą. To mogą być " +"stosowane, gdy montowane przedmioty z dwóch rodzajów materiału zachodzą na " +"siebie." + +msgctxt "carve_multiple_volumes label" +msgid "Remove Mesh Intersection" +msgstr "Usuń przecięcie siatki" + +msgctxt "center_object description" +msgid "" +"Whether to center the object on the middle of the build platform (0,0), " +"instead of using the coordinate system in which the object was saved." +msgstr "" +"Czy środek obiektu znajduje się na środku platformy kompilacji (0,0), " +"zamiast używać układu współrzędnych, w którym został zapisany obiekt." + +msgctxt "center_object label" +msgid "Center object" +msgstr "Środek obiektu" + +msgctxt "coasting_enable description" +msgid "" +"Coasting replaces the last part of an extrusion path with a travel path. The " +"oozed material is used to print the last piece of the extrusion path in " +"order to reduce stringing." +msgstr "" +"Coasting zastępuje ostatnią część ścieżki wytłaczania ścieżką. Zużyty " +"materiał jest używany do drukowania ostatniego kawałka ścieżki wytłaczania w " +"celu zmniejszenia strun." + +msgctxt "coasting_enable label" +msgid "Enable Coasting" +msgstr "Włącz (Coasting) " + +msgctxt "coasting_min_volume description" +msgid "" +"The smallest volume an extrusion path should have before allowing coasting. " +"For smaller extrusion paths, less pressure has been built up in the bowden " +"tube and so the coasted volume is scaled linearly. This value should always " +"be larger than the Coasting Volume." +msgstr "" +"Najmniejsza objętość ścieżka wytłaczania powinna mieć przed umożliwieniem " +"wypłynięcia. W przypadku małych ścieżek wytłaczania w rurce bowden powstało " +"mniejsze ciśnienie, a więc objętość rozbłysku jest skalowana liniowo. Ta " +"wartość powinna zawsze być większa niż objętość przybrzeżna." + +msgctxt "coasting_min_volume label" +msgid "Minimum Volume Before Coasting" +msgstr "Minimalna objętość przed brzegiem" + +msgctxt "coasting_speed description" +msgid "" +"The speed by which to move during coasting, relative to the speed of the " +"extrusion path. A value slightly under 100% is advised, since during the " +"coasting move the pressure in the bowden tube drops." +msgstr "" +"Prędkość poruszania się podczas wybiegu, w stosunku do prędkości ścieżki " +"wytłaczania. Zaleca się wartość nieco poniżej 100%, ponieważ podczas ruchu " +"na brzegach ciśnienie w rurce bowden spada." + +msgctxt "coasting_speed label" +msgid "Coasting Speed" +msgstr "Prędkość wybrzeża" + +msgctxt "coasting_volume description" +msgid "" +"The volume otherwise oozed. This value should generally be close to the " +"nozzle diameter cubed." +msgstr "" +"Objętość została inna. Wartość ta powinna być zasadniczo zbliżona do " +"sześciennej średnicy dyszy." + +msgctxt "coasting_volume label" +msgid "Coasting Volume" +msgstr "Objętość przybrzeżna" + +msgctxt "command_line_settings description" +msgid "" +"Settings which are only used if CuraEngine isn't called from the Cura " +"frontend." +msgstr "" +"Ustawienia, które są używane tylko wtedy, gdy CuraEngine nie jest wywoływana " +"z frontu Cura." + +msgctxt "command_line_settings label" +msgid "Command Line Settings" +msgstr "Ustawienia wiersza polecenia" + +msgctxt "conical_overhang_angle description" +msgid "" +"The maximum angle of overhangs after the they have been made printable. At a " +"value of 0° all overhangs are replaced by a piece of model connected to the " +"build plate, 90° will not change the model in any way." +msgstr "" +"Maksymalny kąt zwisów po ich nadrukowaniu. Przy wartości 0 ° wszystkie zwisy " +"są zastępowane przez wzór modelu połączony z płytą konstrukcyjną, a 90 ° w " +"żaden sposób nie zmienia modelu." + +msgctxt "conical_overhang_angle label" +msgid "Maximum Model Angle" +msgstr "Maksymalny kąt modelu" + +msgctxt "conical_overhang_enabled description" +msgid "" +"Change the geometry of the printed model such that minimal support is " +"required. Steep overhangs will become shallow overhangs. Overhanging areas " +"will drop down to become more vertical." +msgstr "" +"Zmień geometrię drukowanego modelu tak, aby wymagało minimalnego podparcia. " +"Strome zwisanie staną się płytkimi zwisami. Powtórne obszary spadną, aby " +"stać się bardziej pionowe." + +msgctxt "conical_overhang_enabled label" +msgid "Make Overhang Printable" +msgstr "Dokonać nawisy do druku" + +msgctxt "cool_fan_enabled description" +msgid "" +"Enables the print cooling fans while printing. The fans improve print " +"quality on layers with short layer times and bridging / overhangs." +msgstr "" +"Umożliwia rozruch wentylatorom drukującym podczas drukowania. Wentylatory " +"poprawiają jakość wydruku na warstwach o krótkich czasach warstwy i " +"mostkach / zwisach." + +msgctxt "cool_fan_enabled label" +msgid "Enable Print Cooling" +msgstr "Włącz chłodzenie wydruku" + +msgctxt "cool_fan_full_at_height description" +msgid "" +"The height at which the fans spin on regular fan speed. At the layers below " +"the fan speed gradually increases from Initial Fan Speed to Regular Fan " +"Speed." +msgstr "" +"Wysokość, na jaką wirują wentylatorki na regularnej prędkości wentylatora. W " +"warstwach poniżej prędkości wentylatora stopniowo wzrasta od początkowej " +"prędkości wentylatora do stałej prędkości wentylatora." + +msgctxt "cool_fan_full_at_height label" +msgid "Regular Fan Speed at Height" +msgstr "Normalna prędkość wentylatora na wysokości" + +msgctxt "cool_fan_full_layer description" +msgid "" +"The layer at which the fans spin on regular fan speed. If regular fan speed " +"at height is set, this value is calculated and rounded to a whole number." +msgstr "" +"Warstwa, w której wirują wentylatorki o regularnej prędkości wentylatora. " +"Jeśli ustawiona jest regularna prędkość wentylatora na wysokości, wartość ta " +"jest obliczana i zaokrąglana na cały numer." + +msgctxt "cool_fan_full_layer label" +msgid "Regular Fan Speed at Layer" +msgstr "Normalna prędkość obrotową wentylatora w warstwie" + +msgctxt "cool_fan_speed description" +msgid "The speed at which the print cooling fans spin." +msgstr "Prędkość obrotowa wentylatorów drukujących." + +msgctxt "cool_fan_speed label" +msgid "Fan Speed" +msgstr "Prędkość wiatraka" + +msgctxt "cool_fan_speed_0 description" +msgid "" +"The speed at which the fans spin at the start of the print. In subsequent " +"layers the fan speed is gradually increased up to the layer corresponding to " +"Regular Fan Speed at Height." +msgstr "" +"Prędkość, z jaką wentylatory wirują na początku druku. W kolejnych warstwach " +"prędkość wentylatora stopniowo wzrasta do warstwy odpowiadającej regularnej " +"prędkości wentylatora na wysokości." + +msgctxt "cool_fan_speed_0 label" +msgid "Initial Fan Speed" +msgstr "Początkowa prędkość wentylatora" + +msgctxt "cool_fan_speed_max description" +msgid "" +"The speed at which the fans spin on the minimum layer time. The fan speed " +"gradually increases between the regular fan speed and maximum fan speed when " +"the threshold is hit." +msgstr "" +"Prędkość, z jaką wirują wentylatory w minimalnym czasie warstwy. Prędkość " +"wentylatora stopniowo wzrasta między regularną prędkością wentylatora a " +"maksymalną prędkością wentylatora, gdy próg zostanie uderzony." + +msgctxt "cool_fan_speed_max label" +msgid "Maximum Fan Speed" +msgstr "Maksymalna prędkość wentylatora" + +msgctxt "cool_fan_speed_min description" +msgid "" +"The speed at which the fans spin before hitting the threshold. When a layer " +"prints faster than the threshold, the fan speed gradually inclines towards " +"the maximum fan speed." +msgstr "" +"Prędkość obrotowa wentylatorów przed naciśnięciem progu. Kiedy warstwa jest " +"drukowana szybciej niż próg, prędkość wentylatora stopniowo spada do " +"maksymalnej prędkości wentylatora." + +msgctxt "cool_fan_speed_min label" +msgid "Regular Fan Speed" +msgstr "Normalna prędkość wentylatora" + +msgctxt "cool_lift_head description" +msgid "" +"When the minimum speed is hit because of minimum layer time, lift the head " +"away from the print and wait the extra time until the minimum layer time is " +"reached." +msgstr "" +"Jeśli zostanie osiągnięta minimalna prędkość ze względu na czas minimalnej " +"warstwy, głowica drukująca jest podnoszony przez ciśnienie i dodatkowego " +"czasu, aż zostanie osiągnięty minimalny czas na warstwy, czekając." + +msgctxt "cool_lift_head label" +msgid "Lift Head" +msgstr "Unieść głowicę" + +msgctxt "cool_min_layer_time description" +msgid "" +"The minimum time spent in a layer. This forces the printer to slow down, to " +"at least spend the time set here in one layer. This allows the printed " +"material to cool down properly before printing the next layer. Layers may " +"still take shorter than the minimal layer time if Lift Head is disabled and " +"if the Minimum Speed would otherwise be violated." +msgstr "" +"Minimalny czas spędzony w warstwie. Zmusza to drukarkę do spowolnienia, aby " +"przynajmniej spędzić czas ustawiony tutaj w jednej warstwie. Pozwala to na " +"właściwy wydruk przed wydrukowaniem następnej warstwy. Warstwy mogą nadal " +"trwać krócej niż minimalny czas warstwy, jeśli Lift Head jest wyłączony, a " +"jeśli Minimalna prędkość zostanie w inny sposób naruszona." + +msgctxt "cool_min_layer_time label" +msgid "Minimum Layer Time" +msgstr "Minimalny czas na warstwie" + +msgctxt "cool_min_layer_time_fan_speed_max description" +msgid "" +"The layer time which sets the threshold between regular fan speed and " +"maximum fan speed. Layers that print slower than this time use regular fan " +"speed. For faster layers the fan speed gradually increases towards the " +"maximum fan speed." +msgstr "" +"Czas warstwy, który ustala próg pomiędzy regularną prędkością wentylatora a " +"maksymalną prędkością wentylatora. Warstwy, które są drukowane wolniej niż " +"ten czas, używają regularnej prędkości wentylatora. W przypadku szybszych " +"warstw prędkość wentylatora stopniowo wzrasta w kierunku maksymalnej " +"prędkości wentylatora." + +msgctxt "cool_min_layer_time_fan_speed_max label" +msgid "Regular/Maximum Fan Speed Threshold" +msgstr "Regularny / maksymalny próg prędkości wentylatora" + +msgctxt "cool_min_speed description" +msgid "" +"The minimum print speed, despite slowing down due to the minimum layer time. " +"When the printer would slow down too much, the pressure in the nozzle would " +"be too low and result in bad print quality." +msgstr "" +"Minimalna szybkość drukowania, pomimo spowolnienia z powodu minimalnego " +"czasu warstwy. Gdy drukarka spowolniła zbyt dużo, ciśnienie w dyszy byłoby " +"zbyt niskie i spowodowało złe jakości druku." + +msgctxt "cool_min_speed label" +msgid "Minimum Speed" +msgstr "Minimalna prędkość" + +msgctxt "cooling description" +msgid "Cooling" +msgstr "Chłodzenie" + +msgctxt "cooling label" +msgid "Cooling" +msgstr "Chłodzenie" + +msgctxt "cutting_mesh description" +msgid "" +"Limit the volume of this mesh to within other meshes. You can use this to " +"make certain areas of one mesh print with different settings and with a " +"whole different extruder." +msgstr "" +"Ograniczyć objętość tej siatki do innych oczek. Można to zrobić, aby " +"niektóre obszary jednego oczka były drukowane z różnymi ustawieniami iz " +"całością innej wytłaczarki." + +msgctxt "cutting_mesh label" +msgid "Cutting Mesh" +msgstr "Obróbka siatki" + +msgctxt "default_material_print_temperature description" +msgid "" +"The default temperature used for printing. This should be the \"base\" " +"temperature of a material. All other print temperatures should use offsets " +"based on this value" +msgstr "" +"Domyślna temperatura używana do drukowania. Powinno to być temperatura " +"\"podstawy\" materiału. Wszystkie inne temperatury drukowania powinny być " +"wykorzystywane z przesunięciami w oparciu o tę wartość" + +msgctxt "default_material_print_temperature label" +msgid "Default Printing Temperature" +msgstr "Domyślna temperatura druku" + +msgctxt "draft_shield_dist description" +msgid "Distance of the draft shield from the print, in the X/Y directions." +msgstr "Odległość projektowanej osłony od druku, w kierunkach X / Y." + +msgctxt "draft_shield_dist label" +msgid "Draft Shield X/Y Distance" +msgstr "Otwór tarczy X / Y Odległość" + +msgctxt "draft_shield_enabled description" +msgid "" +"This will create a wall around the model, which traps (hot) air and shields " +"against exterior airflow. Especially useful for materials which warp easily." +msgstr "" +"Powoduje to powstanie ściany wokół modelu, która pułapuje (gorące powietrze) " +"i osłona przed zewnętrznym strumieniem powietrza. Szczególnie przydatna w " +"przypadku materiałów, które łatwo oswajają się." + +msgctxt "draft_shield_enabled label" +msgid "Enable Draft Shield" +msgstr "Aktywować przedniej szyby(Draft Shield)" + +msgctxt "draft_shield_height description" +msgid "" +"Height limitation of the draft shield. Above this height no draft shield " +"will be printed." +msgstr "" +"Ograniczenie wysokości osłony przeciwwiatrowej. Powyżej tej wysokości nie " +"zostanie wydrukowana talia robocza." + +msgctxt "draft_shield_height label" +msgid "Draft Shield Height" +msgstr "Wysokość osłony tarczy" + +msgctxt "draft_shield_height_limitation description" +msgid "" +"Set the height of the draft shield. Choose to print the draft shield at the " +"full height of the model or at a limited height." +msgstr "" +"Ustaw wysokość osłony przeciwwiatrowej. Wybierz drukowaną osłonę na całej " +"wysokości modelu lub na ograniczonej wysokości." + +msgctxt "draft_shield_height_limitation label" +msgid "Draft Shield Limitation" +msgstr "Ograniczenie tarczy konstrukcyjnej" + +msgctxt "draft_shield_height_limitation option full" +msgid "Full" +msgstr "Pełny" + +msgctxt "draft_shield_height_limitation option limited" +msgid "Limited" +msgstr "Ograniczony" + +msgctxt "dual description" +msgid "Settings used for printing with multiple extruders." +msgstr "Ustawienia używane do drukowania z wieloma głowicami drukującymi" + +msgctxt "dual label" +msgid "Dual Extrusion" +msgstr "Podwójna głowica drukująca" + +msgctxt "dual_pre_wipe description" +msgid "" +"After switching extruder, wipe the oozed material off of the nozzle on the " +"first thing printed. This performs a safe slow wipe move at a place where " +"the oozed material causes least harm to the surface quality of your print." +msgstr "" +"Po wyłączeniu wytłaczarki wytrzeć wytłoczony materiał z dyszy na pierwszą " +"drukowaną drukarkę. Zapewnia to bezpieczne, wolne przemieszczanie w miejscu, " +"w którym wypchnięty materiał powoduje najmniej szkodliwy wpływ na jakość " +"wydruku." + +msgctxt "dual_pre_wipe label" +msgid "Wipe Nozzle After Switch" +msgstr "Wytrzeć dyszę po przełączeniu" + +msgctxt "expand_lower_skins description" +msgid "" +"Expand the bottom skin areas (areas with air below) so that they are " +"anchored by the infill layers above and below." +msgstr "" +"Rozwiń dolne obszary ścian (obszary o powietrzu poniżej) tak, aby były " +"zakotwiczone przez warstwy wypełniające powyżej i poniżej." + +msgctxt "expand_lower_skins label" +msgid "Expand Bottom Skins Into Infill" +msgstr "Rozszerzyć ściany poniżej wypełnienia" + +msgctxt "expand_skins_expand_distance description" +msgid "" +"The distance the skins are expanded into the infill. The default distance is " +"enough to bridge the gap between the infill lines and will stop holes " +"appearing in the skin where it meets the wall when the infill density is " +"low. A smaller distance will often be sufficient." +msgstr "" +"Odległość ścian są rozszerzane do wypełnienia. Domyślna odległość wystarczy, " +"aby pokonać szczelinę między liniami wypełnienia i zatrzyma otwory " +"pojawiające się w ścianie, gdzie spotyka się ze ścianą, gdy gęstość " +"nasycenia jest niska. Mniejsza odległość będzie często wystarczająca." + +msgctxt "expand_skins_expand_distance label" +msgid "Skin Expand Distance" +msgstr "Odległość rozszerzenie warstwy wierzchniej" + +msgctxt "expand_skins_into_infill description" +msgid "" +"Expand skin areas of top and/or bottom skin of flat surfaces. By default, " +"skins stop under the wall lines that surround infill but this can lead to " +"holes appearing when the infill density is low. This setting extends the " +"skins beyond the wall lines so that the infill on the next layer rests on " +"skin." +msgstr "" +"Rozszerzyć zewnętrzne obszary skóry na górną i / lub dolną powłoką na " +"płaskich powierzchniach. Domyślnie, powłoka kończy się na linii ściany " +"otaczające wypełnienie, chociaż może to prowadzić do małej gęstości otworu " +"napełniania do edukacji. Ustawienie to rozciąga się poza zewnętrzną skórę po " +"liniach ścian, tak, że nadzienie pozostaje na następnej warstwy na " +"zewnętrznej skóry." + +msgctxt "expand_skins_into_infill label" +msgid "Expand Skins Into Infill" +msgstr "Rozszerzyć ściany wypełniania" + +msgctxt "expand_upper_skins description" +msgid "" +"Expand the top skin areas (areas with air above) so that they support infill " +"above." +msgstr "" +"Rozwiń górne obszary ścian (obszary o powietrzu powyżej) tak, aby wspomagały " +"wypełnienie powyżej." + +msgctxt "expand_upper_skins label" +msgid "Expand Top Skins Into Infill" +msgstr "Rozszerzenia ścian w górnym wypełnieniu" + +msgctxt "experimental description" +msgid "experimental!" +msgstr "eksperymentalny!" + +msgctxt "experimental label" +msgid "Experimental" +msgstr "Eksperymentalny" + +msgctxt "extruder_prime_pos_abs description" +msgid "" +"Make the extruder prime position absolute rather than relative to the last-" +"known location of the head." +msgstr "" +"Wolisz bezwzględną pozycję głowicy drukującej zamiast względnego położenia " +"do ostatniej znanej pozycji głowy." + +msgctxt "extruder_prime_pos_abs label" +msgid "Absolute Extruder Prime Position" +msgstr "Wytłaczarka pozycja bezwzględna obciążenie" + +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "" +"Współrzędna X położenia, w którym liczba pierwszych dyszy na początku " +"drukowania." + +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "X wlotu położenie wytłaczarki" + +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "" +"Współrzędna Y położenia, w którym liczba pierwszych dyszy na początku " +"drukowania." + +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "Y-wlotu położenie wytłaczarki" + +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "" +"Współrzędna położenia, w którym dysza liczb pierwszych w rozpoczęcia " +"drukowania." + +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "Z-położenia wlotu wytłaczarki" + +msgctxt "fill_perimeter_gaps description" +msgid "Fills the gaps between walls where no walls fit." +msgstr "Wypełnia szczeliny między ścianami, w których nie ma ścian." + +msgctxt "fill_perimeter_gaps label" +msgid "Fill Gaps Between Walls" +msgstr "Wypełnij szczeliny między ścianami" + +msgctxt "fill_perimeter_gaps option everywhere" +msgid "Everywhere" +msgstr "Wszędzie" + +msgctxt "fill_perimeter_gaps option nowhere" +msgid "Nowhere" +msgstr "Nigdzie" + +msgctxt "gantry_height description" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes)." +msgstr "" +"Różnica wysokości między wierzchołkiem dyszy i układu bramowej (X i Y)." + +msgctxt "gantry_height label" +msgid "Gantry height" +msgstr "wysokość mostka" + +msgctxt "gradual_infill_step_height description" +msgid "" +"The height of infill of a given density before switching to half the density." +msgstr "" +"Wysokość wypełnienia o danej gęstości przed przejściem na połowę gęstości." + +msgctxt "gradual_infill_step_height label" +msgid "Gradual Infill Step Height" +msgstr "Stopień stopniowego wypełnienia" + +msgctxt "gradual_infill_steps description" +msgid "" +"Number of times to reduce the infill density by half when getting further " +"below top surfaces. Areas which are closer to top surfaces get a higher " +"density, up to the Infill Density." +msgstr "" +"Liczba razy, aby zmniejszyć gęstość zalewu o połowę, gdy będzie się dalej " +"pod górnymi powierzchniami. Obszary, które są bliżej górnej powierzchni, " +"mają większą gęstość, aż do gęstości wypełnienia." + +msgctxt "gradual_infill_steps label" +msgid "Gradual Infill Steps" +msgstr "Stopniowe kroki wypełnienia" + +msgctxt "infill description" +msgid "Infill" +msgstr "Wypełnienie" + +msgctxt "infill label" +msgid "Infill" +msgstr "Wypełnienie" + +msgctxt "infill_angles description" +msgid "" +"A list of integer line directions to use. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees for the " +"lines and zig zag patterns and 45 degrees for all other patterns)." +msgstr "" +"Lista prostych poleceń do użycia. Elementy z listy są używane kolejno w " +"miarę postępu warstw, a kiedy kończy się lista, zaczyna się od początku. " +"Elementy listy są oddzielone przecinkami, a cała lista znajduje się w " +"nawiasach kwadratowych. Domyślnie jest pusta lista, która oznacza tradycyjne " +"domyślne kąty (45 i 135 stopni dla linii i wzorów zygzakowców i 45 stopni " +"dla wszystkich pozostałych wzorów)." + +msgctxt "infill_angles label" +msgid "Infill Line Directions" +msgstr "Kierunek lini wypełnienia" + +msgctxt "infill_before_walls description" +msgid "" +"Print the infill before printing the walls. Printing the walls first may " +"lead to more accurate walls, but overhangs print worse. Printing the infill " +"first leads to sturdier walls, but the infill pattern might sometimes show " +"through the surface." +msgstr "" +"Wydrukuj wypełnienie przed wydrukowaniem ścian. Drukowanie ścian po raz " +"pierwszy może prowadzić do bardziej dokładnych ścian, ale pogorszy wydruki. " +"Drukowanie wypełnienia najpierw prowadzi do mocniejszych ścian, ale wzór " +"wypełnienia może czasem wskazywać na powierzchnię." + +msgctxt "infill_before_walls label" +msgid "Infill Before Walls" +msgstr "Wypełnij przed ścianami" + +msgctxt "infill_hollow description" +msgid "" +"Remove all infill and make the inside of the object eligible for support." +msgstr "" +"Usunąć wszystkie wypełnienia i umieścić wewnątrz obiektu kwalifikującego się " +"do wsparcia." + +msgctxt "infill_hollow label" +msgid "Hollow Out Objects" +msgstr "Wyjmij obiekty" + +msgctxt "infill_line_distance description" +msgid "" +"Distance between the printed infill lines. This setting is calculated by the " +"infill density and the infill line width." +msgstr "" +"Odległość między drukowanymi liniami wypełnienia. To ustawienie jest " +"obliczane przez gęstość wypełnienia i szerokość linii wypełnienia." + +msgctxt "infill_line_distance label" +msgid "Infill Line Distance" +msgstr "Odstęp linii wypełnienia" + +msgctxt "infill_line_width description" +msgid "Width of a single infill line." +msgstr "Szerokość pojedynczej linii wypełniania." + +msgctxt "infill_line_width label" +msgid "Infill Line Width" +msgstr "Szerokość linii wypełniania" + +msgctxt "infill_mesh description" +msgid "" +"Use this mesh to modify the infill of other meshes with which it overlaps. " +"Replaces infill regions of other meshes with regions for this mesh. It's " +"suggested to only print one Wall and no Top/Bottom Skin for this mesh." +msgstr "" +"Użyj tej siatki, aby zmodyfikować wypełnienie innych oczek, z którymi się " +"pokrywają. Zastępuje obszary wypełnienia innych oczek z regionami dla tej " +"siatki. Proponuje się wydrukować tylko jedną ścianę, a nie górną / dolną " +"skórę dla tej siatki." + +msgctxt "infill_mesh label" +msgid "Infill Mesh" +msgstr "Siatki wypełniające" + +msgctxt "infill_mesh_order description" +msgid "" +"Determines which infill mesh is inside the infill of another infill mesh. An " +"infill mesh with a higher order will modify the infill of infill meshes with " +"lower order and normal meshes." +msgstr "" +"Określa, która siatka wypełniająca znajduje się wewnątrz wypełnienia innej " +"siatki wypełniającej. Siatka wypełniająca o wyższym porządku modyfikuje " +"wypełnienie siatki wypełnień o niższym rzędzie i normalnych oczek." + +msgctxt "infill_mesh_order label" +msgid "Infill Mesh Order" +msgstr "Zamówienie wypełnienia siatki" + +msgctxt "infill_overlap description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "" +"Ilość nakładania się między wypełnieniem a ścianami. Nieznaczne nałożenie " +"pozwala ściśle łączyć się z wypełnieniem." + +msgctxt "infill_overlap label" +msgid "Infill Overlap Percentage" +msgstr "Procent wypełnienia" + +msgctxt "infill_overlap_mm description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "" +"Ilość nakładania się między wypełnieniem a ścianami. Nieznaczne nałożenie " +"pozwala ściśle łączyć się z wypełnieniem." + +msgctxt "infill_overlap_mm label" +msgid "Infill Overlap" +msgstr "Zachodzenie wypełnienia" + +msgctxt "infill_pattern description" +msgid "" +"The pattern of the infill material of the print. The line and zig zag infill " +"swap direction on alternate layers, reducing material cost. The grid, " +"triangle, cubic, tetrahedral and concentric patterns are fully printed every " +"layer. Cubic and tetrahedral infill change with every layer to provide a " +"more equal distribution of strength over each direction." +msgstr "" +"Wzór materiału wypełniającego z nadruku. Linia i zygzakowy kierunek " +"wypełnienial na alternatywnych warstwach, zmniejszając koszt materiału. " +"Wzory siatki, trójkąty, sześcianu, czworościanu i koncentrycznych są w pełni " +"drukowane na każdej warstwie. Wymiana wypełnienia sześciennego i " +"czterowartościowego z każdą warstwą zapewnia bardziej równomierny rozkład " +"siły w każdym kierunku." + +msgctxt "infill_pattern label" +msgid "Infill Pattern" +msgstr "Wzór wypełnienia" + +msgctxt "infill_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +msgctxt "infill_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Koncentryczny 3D" + +msgctxt "infill_pattern option cubic" +msgid "Cubic" +msgstr "Sześcienny" + +msgctxt "infill_pattern option cubicsubdiv" +msgid "Cubic Subdivision" +msgstr "Podział sześcienny" + +msgctxt "infill_pattern option grid" +msgid "Grid" +msgstr "Krata" + +msgctxt "infill_pattern option lines" +msgid "Lines" +msgstr "Liniowy" + +msgctxt "infill_pattern option tetrahedral" +msgid "Tetrahedral" +msgstr "Czworościenny" + +msgctxt "infill_pattern option triangles" +msgid "Triangles" +msgstr "Trójkąty" + +msgctxt "infill_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "infill_sparse_density description" +msgid "Adjusts the density of infill of the print." +msgstr "Dostosowuje gęstość wypełnienia wydruku." + +msgctxt "infill_sparse_density label" +msgid "Infill Density" +msgstr "Gęstość wypełnienia" + +msgctxt "infill_sparse_thickness description" +msgid "" +"The thickness per layer of infill material. This value should always be a " +"multiple of the layer height and is otherwise rounded." +msgstr "" +"Grubość na warstwie materiału wypełniającego. Ta wartość powinna zawsze być " +"wielokrotnością wysokości warstwy i być zaokrąglana w inny sposób." + +msgctxt "infill_sparse_thickness label" +msgid "Infill Layer Thickness" +msgstr "Grubość warstwy wypełnienia" + +msgctxt "infill_wipe_dist description" +msgid "" +"Distance of a travel move inserted after every infill line, to make the " +"infill stick to the walls better. This option is similar to infill overlap, " +"but without extrusion and only on one end of the infill line." +msgstr "" +"Odległość przesuwu włożonego po każdej linii wylotowej, aby lepiej " +"przymocować drążek wyrównawczy do ścian. Ta opcja jest podobna do nakładania " +"się wypełnienia, ale bez wytłaczania i tylko na jednym końcu linii " +"wypełnienia." + +msgctxt "infill_wipe_dist label" +msgid "Infill Wipe Distance" +msgstr "Odstęp wypełnienia" + +msgctxt "jerk_enabled description" +msgid "" +"Enables adjusting the jerk of print head when the velocity in the X or Y " +"axis changes. Increasing the jerk can reduce printing time at the cost of " +"print quality." +msgstr "" +"Umożliwia dostosowanie funkcji szarpnięć głowicy drukującej w przypadku " +"zmiany prędkości w osi X lub Y. Zwiększenie funkcji szarpnięć może skrócić " +"czas drukowania kosztem jakości druku." + +msgctxt "jerk_enabled label" +msgid "Enable Jerk Control" +msgstr "Aktywuj kontrolę szarpnięć" + +msgctxt "jerk_infill description" +msgid "The maximum instantaneous velocity change with which infill is printed." +msgstr "" +"Maksymalna różnica prędkości chwilowej w którym wypełnienie jest drukowane." + +msgctxt "jerk_infill label" +msgid "Infill Jerk" +msgstr "Wypełnienie Funkcja szarpnięcie(jerk)" + +msgctxt "jerk_layer_0 description" +msgid "The print maximum instantaneous velocity change for the initial layer." +msgstr "Maksymalna zmiana chwilowej prędkości dla pierwszej warstwy." + +msgctxt "jerk_layer_0 label" +msgid "Initial Layer Jerk" +msgstr "Funkcja szarpnięcie(jerk) pierwszej warstwie" + +msgctxt "jerk_prime_tower description" +msgid "" +"The maximum instantaneous velocity change with which the prime tower is " +"printed." +msgstr "Maksymalne chwilowe zmiany prędkości posuwu z wieżą jest drukowany." + +msgctxt "jerk_prime_tower label" +msgid "Prime Tower Jerk" +msgstr "Jerk zmiany prędkości posuwu z wieżą" + +msgctxt "jerk_print description" +msgid "The maximum instantaneous velocity change of the print head." +msgstr "Maksymalna chwilowa zmiana prędkości głowicy drukującej." + +msgctxt "jerk_print label" +msgid "Print Jerk" +msgstr "Jerk funkcja druku" + +msgctxt "jerk_print_layer_0 description" +msgid "" +"The maximum instantaneous velocity change during the printing of the initial " +"layer." +msgstr "" +"Maksymalna zmiana chwilowej prędkości podczas druku na pierwszej warstwie" + +msgctxt "jerk_print_layer_0 label" +msgid "Initial Layer Print Jerk" +msgstr "Jerk warstwy początkowej druku" + +msgctxt "jerk_skirt_brim description" +msgid "" +"The maximum instantaneous velocity change with which the skirt and brim are " +"printed." +msgstr "" +"Maksymalna zmiana chwilowej prędkości mogą być drukowane z płaszcza i brzegi." + +msgctxt "jerk_skirt_brim label" +msgid "Skirt/Brim Jerk" +msgstr "Jerk Skirt/Brim" + +msgctxt "jerk_support description" +msgid "" +"The maximum instantaneous velocity change with which the support structure " +"is printed." +msgstr "" +"Maksymalna natychmiastowa zmiana prędkości, przy której konstrukcja nośna " +"jest drukowana." + +msgctxt "jerk_support label" +msgid "Support Jerk" +msgstr "Jerk konstrukcja nośna " + +msgctxt "jerk_support_bottom description" +msgid "" +"The maximum instantaneous velocity change with which the floors of support " +"are printed." +msgstr "Maksymalna szybkość zmiany chwilowej, z jaką są drukowane podłoża." + +msgctxt "jerk_support_bottom label" +msgid "Support Floor Jerk" +msgstr "Funkcja szarpnięcie(jerk) struktury podłoża" + +msgctxt "jerk_support_infill description" +msgid "" +"The maximum instantaneous velocity change with which the infill of support " +"is printed." +msgstr "" +"Maksymalna różnica prędkości chwilowej z których wypełnienie konstrukcji " +"nośnej jest drukowane." + +msgctxt "jerk_support_infill label" +msgid "Support Infill Jerk" +msgstr "Funkcja szarpnięcie(jerk) konstrukcja nośna wypełniania" + +msgctxt "jerk_support_interface description" +msgid "" +"The maximum instantaneous velocity change with which the roofs and floors of " +"support are printed." +msgstr "" +"Maksymalna natychmiastowa zmiana prędkości, przy której dachy i stropy " +"konstrukcji nośnej mają zostać wydrukowane." + +msgctxt "jerk_support_interface label" +msgid "Support Interface Jerk" +msgstr "Funkcja szarpnięcie(jerk) interfejs konstrukcja nośna" + +msgctxt "jerk_support_roof description" +msgid "" +"The maximum instantaneous velocity change with which the roofs of support " +"are printed." +msgstr "" +"Maksymalna zmiana chwilowej prędkości z dachów konstrukcji nośnej do " +"wydrukowania." + +msgctxt "jerk_support_roof label" +msgid "Support Roof Jerk" +msgstr "Funkcja szarpnięcie(jerk) do konstrukcji dachu" + +msgctxt "jerk_topbottom description" +msgid "" +"The maximum instantaneous velocity change with which top/bottom layers are " +"printed." +msgstr "" +"Maksymalna różnica prędkości chwilowej w którym górne / dolne warstwy druku." + +msgctxt "jerk_topbottom label" +msgid "Top/Bottom Jerk" +msgstr "Funkcja szarpnięcie(jerk) górnej / dolnej warstwy" + +msgctxt "jerk_travel description" +msgid "" +"The maximum instantaneous velocity change with which travel moves are made." +msgstr "" +"Maksymalna natychmiastowa zmiana prędkości, przy której odbywa się ruch " +"podróży." + +msgctxt "jerk_travel label" +msgid "Travel Jerk" +msgstr "Podróże Jerk" + +msgctxt "jerk_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "Przyspieszenie ruchu napędu pierwszej warstwy." + +msgctxt "jerk_travel_layer_0 label" +msgid "Initial Layer Travel Jerk" +msgstr "Funkcja szarpnięcie przepływu w pierwszej warstwie" + +msgctxt "jerk_wall description" +msgid "" +"The maximum instantaneous velocity change with which the walls are printed." +msgstr "Maksymalna różnica prędkości chwilowej z którego ściany są drukowane." + +msgctxt "jerk_wall label" +msgid "Wall Jerk" +msgstr "Funkcja szarpnięcie(jerk) ścianki" + +msgctxt "jerk_wall_0 description" +msgid "" +"The maximum instantaneous velocity change with which the outermost walls are " +"printed." +msgstr "" +"Maksymalna zmiana chwilowej prędkości z zewnętrznymi ścianami do " +"wydrukowania." + +msgctxt "jerk_wall_0 label" +msgid "Outer Wall Jerk" +msgstr "Funkcja szarpnięcie(jerk) zewnątrz ścianki" + +msgctxt "jerk_wall_x description" +msgid "" +"The maximum instantaneous velocity change with which all inner walls are " +"printed." +msgstr "" +"Maksymalna zmiana chwilowej prędkości, wszystkie wewnętrzne ściany są " +"drukowane." + +msgctxt "jerk_wall_x label" +msgid "Inner Wall Jerk" +msgstr "Funkcja szarpnięcie(jerk) wewnętrznej ściance" + +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the model overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "" +"Pierwsza i druga warstwa modelu są zachodzą na siebie w kierunku Z w celu " +"skompensowania utraconego włókna w szczelinie powietrznej. Przenieś " +"wszystkie modele od pierwszej warstwy modelu o tej wartości w dół." + +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Początkowa warstwa Z pokrywają się" + +msgctxt "layer_height description" +msgid "" +"The height of each layer in mm. Higher values produce faster prints in lower " +"resolution, lower values produce slower prints in higher resolution." +msgstr "" +"Grubość każdej warstwy w mm. Przy wyższych wartościach szybsze Urządzenie " +"jest przystosowane do niższej rozdzielczości w niższych wartościach wolniej " +"wydruki o wyższej rozdzielczości." + +msgctxt "layer_height label" +msgid "Layer Height" +msgstr "Grubość warstwy" + +msgctxt "layer_height_0 description" +msgid "" +"The height of the initial layer in mm. A thicker initial layer makes " +"adhesion to the build plate easier." +msgstr "" +"Wysokość początkowej warstwy w mm. Grubsza warstwa powoduje lepszą " +"początkową przyczepność do stołu." + +msgctxt "layer_height_0 label" +msgid "Initial Layer Height" +msgstr "Grubość pierwszej warstwy" + +msgctxt "layer_start_x description" +msgid "" +"The X coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "" +"Współrzędna X położenia, w pobliżu miejsca, gdzie znajduje się część, aby " +"rozpocząć drukowanie każdej warstwy." + +msgctxt "layer_start_x label" +msgid "Layer Start X" +msgstr "Uruchomienie warstwy X" + +msgctxt "layer_start_y description" +msgid "" +"The Y coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "" +"Współrzędna Y położenia, w pobliżu miejsca, gdzie znajduje się część, aby " +"rozpocząć drukowanie każdej warstwy." + +msgctxt "layer_start_y label" +msgid "Layer Start Y" +msgstr "Uruchom warstwę Y" + +msgctxt "line_width description" +msgid "" +"Width of a single line. Generally, the width of each line should correspond " +"to the width of the nozzle. However, slightly reducing this value could " +"produce better prints." +msgstr "" +"Szerokość jednej linii. Ogólnie, szerokość powinna odpowiadać każdej linii " +"szerokości dyszy. Jednak nieznaczne zmniejszenie tej wartości może " +"doprowadzić do lepszego drukowania." + +msgctxt "line_width label" +msgid "Line Width" +msgstr "Szerokość linii" + +msgctxt "machine_acceleration description" +msgid "The default acceleration of print head movement." +msgstr "Domyślną przyspieszenie ruchu głowicy drukującej." + +msgctxt "machine_acceleration label" +msgid "Default Acceleration" +msgstr "Domyślne przyspieszenie" + +msgctxt "machine_center_is_zero description" +msgid "" +"Whether the X/Y coordinates of the zero position of the printer is at the " +"center of the printable area." +msgstr "" +"Określa, czy X / Y współrzędne położenia zerowego drukarki znajdują się w " +"środku obszaru wydruku." + +msgctxt "machine_center_is_zero label" +msgid "Is center origin" +msgstr "Jest centralnym źródłem" + +msgctxt "machine_depth description" +msgid "The depth (Y-direction) of the printable area." +msgstr "Głębokość (w kierunku Y) obszaru drukowania." + +msgctxt "machine_depth label" +msgid "Machine depth" +msgstr "Głębokość drukarki" + +msgctxt "machine_disallowed_areas description" +msgid "A list of polygons with areas the print head is not allowed to enter." +msgstr "" +"Lista wielokątów z obszarów, które nie są dopuszczone do głowicy drukującej." + +msgctxt "machine_disallowed_areas label" +msgid "Disallowed areas" +msgstr "Zakazane obszary" + +msgctxt "machine_end_gcode description" +msgid "" +"Gcode commands to be executed at the very end - separated by \n" +"." +msgstr "" +"Polecenia G-kodu są wykonywane na samym końcu - oddzielone \n" +"." + +msgctxt "machine_end_gcode label" +msgid "End GCode" +msgstr "Koniec G-kodu" + +msgctxt "machine_extruder_count description" +msgid "" +"Number of extruder trains. An extruder train is the combination of a feeder, " +"bowden tube, and nozzle." +msgstr "" +"Liczba pociągów wytłaczarek. Pociąg wytłaczający jest połączeniem podajnika, " +"rurki bowdenowej i dyszy." + +msgctxt "machine_extruder_count label" +msgid "Number of Extruders" +msgstr "Numer głowicy drukującej." + +msgctxt "machine_filament_park_distance description" +msgid "" +"The distance from the tip of the nozzle where to park the filament when an " +"extruder is no longer used." +msgstr "" +"Odległość od końcówki dyszy, w którym włókno jest zaparkowany, gdy " +"wytłaczarka nie jest wykorzystywana." + +msgctxt "machine_filament_park_distance label" +msgid "Filament Park Distance" +msgstr "Odległość Parku filamentowego" + +msgctxt "machine_gcode_flavor description" +msgid "The type of gcode to be generated." +msgstr "Typ gcode, który ma zostać wygenerowany." + +msgctxt "machine_gcode_flavor label" +msgid "Gcode flavour" +msgstr "G-kod wersja" + +msgctxt "machine_gcode_flavor option BFB" +msgid "Bits from Bytes" +msgstr "Bits from Bytes" + +msgctxt "machine_gcode_flavor option Griffin" +msgid "Griffin" +msgstr "Nowicjusz" + +msgctxt "machine_gcode_flavor option MACH3" +msgid "Mach3" +msgstr "Mach3" + +msgctxt "machine_gcode_flavor option Makerbot" +msgid "Makerbot" +msgstr "Makerbot" + +msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" +msgid "RepRap (Marlin/Sprinter)" +msgstr "RepRap (Marlin/Sprinter)" + +msgctxt "machine_gcode_flavor option RepRap (Volumatric)" +msgid "RepRap (Volumetric)" +msgstr "RepRap (Volumetrisch)" + +msgctxt "machine_gcode_flavor option Repetier" +msgid "Repetier" +msgstr "Repetier" + +msgctxt "machine_gcode_flavor option UltiGCode" +msgid "Ultimaker 2" +msgstr "Ultimaker 2" + +msgctxt "machine_head_polygon description" +msgid "A 2D silhouette of the print head (fan caps excluded)." +msgstr "2D kontur głowicy drukującej (bez nasadki wentylatora)." + +msgctxt "machine_head_polygon label" +msgid "Machine head polygon" +msgstr "Urządzenie głowica wielokąta" + +msgctxt "machine_head_with_fans_polygon description" +msgid "A 2D silhouette of the print head (fan caps included)." +msgstr "2D kontur głowicy drukującej (CAPS wentylatora w zestawie)." + +msgctxt "machine_head_with_fans_polygon label" +msgid "Machine head & Fan polygon" +msgstr "Głowica urządzenia i wentylator wielokąta" + +msgctxt "machine_heat_zone_length description" +msgid "" +"The distance from the tip of the nozzle in which heat from the nozzle is " +"transferred to the filament." +msgstr "" +"Odległość od końcówki dyszy, w której ciepło z dyszy jest przenoszone do " +"włókna ciągłego." + +msgctxt "machine_heat_zone_length label" +msgid "Heat zone length" +msgstr "Długość strefy cieplnej" + +msgctxt "machine_heated_bed description" +msgid "Whether the machine has a heated build plate present." +msgstr "Czy maszyna ma podgrzewany stół?" + +msgctxt "machine_heated_bed label" +msgid "Has heated build plate" +msgstr "Posiada grzany stół" + +msgctxt "machine_height description" +msgid "The height (Z-direction) of the printable area." +msgstr "Wysokość (w kierunku Z) obszaru drukowania." + +msgctxt "machine_height label" +msgid "Machine height" +msgstr "Wysokość drukarki" + +msgctxt "machine_max_acceleration_e description" +msgid "Maximum acceleration for the motor of the filament." +msgstr "Maksymalne przyspieszenie dla silnika filamentu." + +msgctxt "machine_max_acceleration_e label" +msgid "Maximum Filament Acceleration" +msgstr "Maksymalna przyspieszenie filamentu" + +msgctxt "machine_max_acceleration_x description" +msgid "Maximum acceleration for the motor of the X-direction" +msgstr "Maksymalne przyspieszenie dla silnika w kierunku X." + +msgctxt "machine_max_acceleration_x label" +msgid "Maximum Acceleration X" +msgstr "Maksymalne przyspieszenie X" + +msgctxt "machine_max_acceleration_y description" +msgid "Maximum acceleration for the motor of the Y-direction." +msgstr "Maksymalne przyspieszenie dla silnika w kierunku Y." + +msgctxt "machine_max_acceleration_y label" +msgid "Maximum Acceleration Y" +msgstr "Maksymalne przyspieszenie Y" + +msgctxt "machine_max_acceleration_z description" +msgid "Maximum acceleration for the motor of the Z-direction." +msgstr "Maksymalne przyspieszenie dla silnika w kierunku Z." + +msgctxt "machine_max_acceleration_z label" +msgid "Maximum Acceleration Z" +msgstr " maksymalnie przyspieszenie Z" + +msgctxt "machine_max_feedrate_e description" +msgid "The maximum speed of the filament." +msgstr "Maksymalna prędkość włókna." + +msgctxt "machine_max_feedrate_e label" +msgid "Maximum Feedrate" +msgstr "Maksymalny posuw" + +msgctxt "machine_max_feedrate_x description" +msgid "The maximum speed for the motor of the X-direction." +msgstr "Maksymalna prędkość silnika w kierunku X." + +msgctxt "machine_max_feedrate_x label" +msgid "Maximum Speed X" +msgstr "Maksymalna prędkość X" + +msgctxt "machine_max_feedrate_y description" +msgid "The maximum speed for the motor of the Y-direction." +msgstr "Maksymalna prędkość silnika w kierunku Y." + +msgctxt "machine_max_feedrate_y label" +msgid "Maximum Speed Y" +msgstr "Maksymalna prędkość Y" + +msgctxt "machine_max_feedrate_z description" +msgid "The maximum speed for the motor of the Z-direction." +msgstr "Maksymalna prędkość silnika w kierunku Z." + +msgctxt "machine_max_feedrate_z label" +msgid "Maximum Speed Z" +msgstr "Maksymalna prędkość Z" + +msgctxt "machine_max_jerk_e description" +msgid "Default jerk for the motor of the filament." +msgstr "Domyślny szarpnięcie dla silnika filamentu" + +msgctxt "machine_max_jerk_e label" +msgid "Default Filament Jerk" +msgstr "Domyślny Jerk Filamentu" + +msgctxt "machine_max_jerk_xy description" +msgid "Default jerk for movement in the horizontal plane." +msgstr "Domyślny szarpnięcie za ruch w płaszczyźnie poziomej." + +msgctxt "machine_max_jerk_xy label" +msgid "Default X-Y Jerk" +msgstr "Domyślna X Y Jerk" + +msgctxt "machine_max_jerk_z description" +msgid "Default jerk for the motor of the Z-direction." +msgstr "Domyślny szarpnięcie do silnika w kierunku Z." + +msgctxt "machine_max_jerk_z label" +msgid "Default Z Jerk" +msgstr "Domyślny Z Jerk" + +msgctxt "machine_min_cool_heat_time_window description" +msgid "" +"The minimal time an extruder has to be inactive before the nozzle is cooled. " +"Only when an extruder is not used for longer than this time will it be " +"allowed to cool down to the standby temperature." +msgstr "" +"Minimalny czas wytłaczarki musi być nieaktywny przed ochłodzeniem dyszy. " +"Dopiero, gdy wytłaczarka nie zostanie użyta dłużej niż w tym czasie " +"pozostanie ona ochłodzona do temperatury wstrzymania." + +msgctxt "machine_min_cool_heat_time_window label" +msgid "Minimal Time Standby Temperature" +msgstr "Minimalna temperatura czuwania w trybie gotowości" + +msgctxt "machine_minimum_feedrate description" +msgid "The minimal movement speed of the print head." +msgstr "Minimalna prędkość ruchu głowicy drukującej." + +msgctxt "machine_minimum_feedrate label" +msgid "Minimum Feedrate" +msgstr "Minimalna prędkość posuwu" + +msgctxt "machine_name description" +msgid "The name of your 3D printer model." +msgstr "Nazwa Twojego modelu drukarki 3D." + +msgctxt "machine_name label" +msgid "Machine Type" +msgstr "Typ drukarki" + +msgctxt "machine_nozzle_cool_down_speed description" +msgid "" +"The speed (°C/s) by which the nozzle cools down averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "" +"Szybkość (° C / s.), Z którym dysza chłodzi średnio przy normalnym ciśnieniu " +"i temperaturach jest w stanie gotowości." + +msgctxt "machine_nozzle_cool_down_speed label" +msgid "Cool down speed" +msgstr "Prędkość chłodzenia" + +msgctxt "machine_nozzle_expansion_angle description" +msgid "" +"The angle between the horizontal plane and the conical part right above the " +"tip of the nozzle." +msgstr "" +"Kąt pomiędzy poziomą powierzchnią i częścią stożkową bezpośrednio powyżej " +"dyszy." + +msgctxt "machine_nozzle_expansion_angle label" +msgid "Nozzle angle" +msgstr "Kąt dyszy" + +msgctxt "machine_nozzle_head_distance description" +msgid "" +"The height difference between the tip of the nozzle and the lowest part of " +"the print head." +msgstr "" +"Różnica w wysokości pomiędzy końcówki dyszy i najniższej części głowicy " +"drukującej." + +msgctxt "machine_nozzle_head_distance label" +msgid "Nozzle length" +msgstr "Długość dysz" + +msgctxt "machine_nozzle_heat_up_speed description" +msgid "" +"The speed (°C/s) by which the nozzle heats up averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "" +"Szybkość (° C / s.), Z którym dysza ogrzewa średnio przy normalnym ciśnieniu " +"i temperaturach jest w stanie gotowości." + +msgctxt "machine_nozzle_heat_up_speed label" +msgid "Heat up speed" +msgstr "Prędkość nagrzewania" + +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "" +"Wewnętrzna średnica dyszy. Użyj tego ustawienia, jeśli używasz dyszę o " +"niestandardowym rozmiarze." + +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "Średnica dyszy" + +msgctxt "machine_nozzle_temp_enabled description" +msgid "" +"Whether to control temperature from Cura. Turn this off to control nozzle " +"temperature from outside of Cura." +msgstr "" +"Do kontroli temperatury Cura. Wyłączyć tę funkcję, aby kontrolować " +"temperaturę dyszy poza Cura." + +msgctxt "machine_nozzle_temp_enabled label" +msgid "Enable Nozzle Temperature Control" +msgstr "Umożliwi kontrolę temperatury dyszy" + +msgctxt "machine_nozzle_tip_outer_diameter description" +msgid "The outer diameter of the tip of the nozzle." +msgstr "Zewnętrzna średnica dyszy." + +msgctxt "machine_nozzle_tip_outer_diameter label" +msgid "Outer nozzle diameter" +msgstr "Średnica dyszy zewnętrznej" + +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "Ustawienia specyficzne dla urządzenia" + +msgctxt "machine_settings label" +msgid "Machine" +msgstr "Drukarka" + +msgctxt "machine_shape description" +msgid "" +"The shape of the build plate without taking unprintable areas into account." +msgstr "Kształt stołu bez uwzględniania obszarów nieprzedstawnych/klamry itp." + +msgctxt "machine_shape label" +msgid "Build plate shape" +msgstr "Wymiary stołu" + +msgctxt "machine_shape option elliptic" +msgid "Elliptic" +msgstr "Eliptyczny" + +msgctxt "machine_shape option rectangular" +msgid "Rectangular" +msgstr "Prostokątny" + +msgctxt "machine_show_variants description" +msgid "" +"Whether to show the different variants of this machine, which are described " +"in separate json files." +msgstr "" +"Opcjonalnie wyświetlane są różne wersje tego urządzenia, które są opisane w " +"oddzielnych plikach JSON." + +msgctxt "machine_show_variants label" +msgid "Show machine variants" +msgstr "Pokaż warianty drukarki" + +msgctxt "machine_start_gcode description" +msgid "" +"Gcode commands to be executed at the very start - separated by \n" +"." +msgstr "" +"Polecenia Gkod są wykonywane od samego początku - oddzielone \n" +"." + +msgctxt "machine_start_gcode label" +msgid "Start GCode" +msgstr "Rozpocznij G-kod" + +msgctxt "machine_use_extruder_offset_to_offset_coords description" +msgid "Apply the extruder offset to the coordinate system." +msgstr "Zastosuj głowicę drukującą do przesunięcia układu współrzędnych." + +msgctxt "machine_use_extruder_offset_to_offset_coords label" +msgid "Offset With Extruder" +msgstr "Przesunięcie głowicy drukującej" + +msgctxt "machine_width description" +msgid "The width (X-direction) of the printable area." +msgstr "Szerokość (w kierunku X) obszaru drukowania." + +msgctxt "machine_width label" +msgid "Machine width" +msgstr "Szerokość drukarki" + +msgctxt "magic_fuzzy_skin_enabled description" +msgid "" +"Randomly jitter while printing the outer wall, so that the surface has a " +"rough and fuzzy look." +msgstr "" +"Losowo jitter podczas drukowania zewnętrznej ściany, tak że powierzchnia ma " +"szorstki i rozmyty wygląd." + +msgctxt "magic_fuzzy_skin_enabled label" +msgid "Fuzzy Skin" +msgstr "Nierówna skóra" + +msgctxt "magic_fuzzy_skin_point_density description" +msgid "" +"The average density of points introduced on each polygon in a layer. Note " +"that the original points of the polygon are discarded, so a low density " +"results in a reduction of the resolution." +msgstr "" +"Średnia gęstość punktów wprowadzonych na każdy wielokąt w warstwie. Zauważ, " +"że oryginalne punkty wielokąta są odrzucane, a więc niska gęstość powoduje " +"zmniejszenie rozdzielczości." + +msgctxt "magic_fuzzy_skin_point_density label" +msgid "Fuzzy Skin Density" +msgstr "Gęstość nierównej skóry" + +msgctxt "magic_fuzzy_skin_point_dist description" +msgid "" +"The average distance between the random points introduced on each line " +"segment. Note that the original points of the polygon are discarded, so a " +"high smoothness results in a reduction of the resolution. This value must be " +"higher than half the Fuzzy Skin Thickness." +msgstr "" +"Średnia odległość między punktami losowymi wprowadzonymi w każdym segmencie " +"linii. Zwróć uwagę, że oryginalne punkty wielokąta są odrzucane, a zatem " +"duża gładkość powoduje zmniejszenie rozdzielczości. Wartość ta musi być " +"większa niż połowa rozmytej grubości skóry." + +msgctxt "magic_fuzzy_skin_point_dist label" +msgid "Fuzzy Skin Point Distance" +msgstr "Plamki nierównej skóry" + +msgctxt "magic_fuzzy_skin_thickness description" +msgid "" +"The width within which to jitter. It's advised to keep this below the outer " +"wall width, since the inner walls are unaltered." +msgstr "" +"Szerokość, w której ma się drgać. Zaleca się zachować ją poniżej zewnętrznej " +"szerokości ścianki, ponieważ wewnętrzne ściany nie uległy zmianie." + +msgctxt "magic_fuzzy_skin_thickness label" +msgid "Fuzzy Skin Thickness" +msgstr "Grubość skóry niejednorodnego" + +msgctxt "magic_mesh_surface_mode description" +msgid "" +"Treat the model as a surface only, a volume, or volumes with loose surfaces. " +"The normal print mode only prints enclosed volumes. \"Surface\" prints a " +"single wall tracing the mesh surface with no infill and no top/bottom skin. " +"\"Both\" prints enclosed volumes like normal and any remaining polygons as " +"surfaces." +msgstr "" +"Traktuj model jako tylko powierzchnię, objętość lub objętość z luźnymi " +"powierzchniami. Zwykły tryb drukowania drukuje tylko zamknięte wolumeny. " +"\"Powierzchnia\" drukuje pojedynczą ścianę śledzącą powierzchnię siatki bez " +"wypełnienia, a nie górna / dolna skóra. \"Oba\" drukuje zamknięte tomy takie " +"jak zwykłe i wszelkie pozostałe wielokąty jako powierzchnie." + +msgctxt "magic_mesh_surface_mode label" +msgid "Surface Mode" +msgstr "Tryb powierzchni" + +msgctxt "magic_mesh_surface_mode option both" +msgid "Both" +msgstr "Obie" + +msgctxt "magic_mesh_surface_mode option normal" +msgid "Normal" +msgstr "Normalna" + +msgctxt "magic_mesh_surface_mode option surface" +msgid "Surface" +msgstr "Powierzchnia" + +msgctxt "magic_spiralize description" +msgid "" +"Spiralize smooths out the Z move of the outer edge. This will create a " +"steady Z increase over the whole print. This feature turns a solid model " +"into a single walled print with a solid bottom. This feature should only be " +"enabled when each layer only contains a single part." +msgstr "" +"Spirala wygładza ruch Z na zewnętrznej krawędzi. Powoduje to stały wzrost Z " +"w całym druku. Ta funkcja zamienia solidny model w pojedynczy, ścienny " +"nadruk z solidnym dnem. Ta funkcja powinna być włączona tylko wtedy, gdy " +"każda warstwa zawiera tylko jedną część." + +msgctxt "magic_spiralize label" +msgid "Spiralize Outer Contour" +msgstr "Zewnętrzne kontury po spirali" + +msgctxt "material description" +msgid "Material" +msgstr "Materiał" + +msgctxt "material label" +msgid "Material" +msgstr "Materiał" + +msgctxt "material_bed_temp_prepend description" +msgid "" +"Whether to include build plate temperature commands at the start of the " +"gcode. When the start_gcode already contains build plate temperature " +"commands Cura frontend will automatically disable this setting." +msgstr "" +"Możliwość wstawienia polecenia do temperatury płyty drukarskiej na początku " +"kodu G. Jeśli start_gcode zawiera już polecenia dla temperatury płyty " +"drukarskiej, program Cura wyłącza to ustawienie automatycznie." + +msgctxt "material_bed_temp_prepend label" +msgid "Include build plate temperature" +msgstr "Należy uwzględnić temperaturę stołu" + +msgctxt "material_bed_temp_wait description" +msgid "" +"Whether to insert a command to wait until the build plate temperature is " +"reached at the start." +msgstr "" +"Czy wstawić komendę, poczekaj, aż temperatura stołu zostanie osiągnięta na " +"początku." + +msgctxt "material_bed_temp_wait label" +msgid "Wait for build plate heatup" +msgstr "Oczekiwanie na ogrzanie stołu" + +msgctxt "material_bed_temperature description" +msgid "" +"The temperature used for the heated build plate. If this is 0, the bed will " +"not heat up for this print." +msgstr "" +"Temperatura stosowana przy ogrzewanej płytce. Jeśli jest to 0, łóżko nie " +"rozgrzeje się dla tego wydruku." + +msgctxt "material_bed_temperature label" +msgid "Build Plate Temperature" +msgstr "Konstruuj temperaturę stołu" + +msgctxt "material_bed_temperature_layer_0 description" +msgid "The temperature used for the heated build plate at the first layer." +msgstr "Temperatura stosowana przy ogrzewanym stole w pierwszej warstwie." + +msgctxt "material_bed_temperature_layer_0 label" +msgid "Build Plate Temperature Initial Layer" +msgstr "Temperatura stołu na pierwszej warstwie" + +msgctxt "material_diameter description" +msgid "" +"Adjusts the diameter of the filament used. Match this value with the " +"diameter of the used filament." +msgstr "" +"Dostosowuje średnicę stosowanego filamentu. Dopasuj tę wartość do średnicy " +"stosowanego filamentu." + +msgctxt "material_diameter label" +msgid "Diameter" +msgstr "Średnica" + +msgctxt "material_extrusion_cool_down_speed description" +msgid "" +"The extra speed by which the nozzle cools while extruding. The same value is " +"used to signify the heat up speed lost when heating up while extruding." +msgstr "" +"Dodatkowa szybkość, w wyniku której dysze chłodzą się podczas wytłaczania. " +"Ta sama wartość jest używana do oznaczania szybkości nagrzewania utraconej " +"podczas nagrzewania podczas wytłaczania." + +msgctxt "material_extrusion_cool_down_speed label" +msgid "Extrusion Cool Down Speed Modifier" +msgstr "Regulatory prędkości do chłodzenia na wytłaczanie" + +msgctxt "material_final_print_temperature description" +msgid "" +"The temperature to which to already start cooling down just before the end " +"of printing." +msgstr "" +"Temperatura, po której zaczyna się chłodzenie tuż przed końcem drukowania." + +msgctxt "material_final_print_temperature label" +msgid "Final Printing Temperature" +msgstr "Temperatura druku końcowego" + +msgctxt "material_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "" +"Kompensacja przepływu: ilość materiału wytłaczanego jest mnożona przez tę " +"wartość." + +msgctxt "material_flow label" +msgid "Flow" +msgstr "Przepływ" + +msgctxt "material_flow_dependent_temperature description" +msgid "" +"Change the temperature for each layer automatically with the average flow " +"speed of that layer." +msgstr "" +"Zmienić temperaturę każdej warstwy automatycznie przy średniej prędkości " +"przepływu tej warstwy." + +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Auto Temperatura" + +msgctxt "material_flow_temp_graph description" +msgid "" +"Data linking material flow (in mm3 per second) to temperature (degrees " +"Celsius)." +msgstr "" +"Dane łączące przepływ materiału (w mm3 na sekundę) do temperatury (stopni " +"Celsjusza)." + +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Wykres temperatury przepływu" + +msgctxt "material_guid description" +msgid "GUID of the material. This is set automatically. " +msgstr "GUID materiału. To jest ustawiana automatycznie." + +msgctxt "material_guid label" +msgid "Material GUID" +msgstr "Materiał-GUID" + +msgctxt "material_initial_print_temperature description" +msgid "" +"The minimal temperature while heating up to the Printing Temperature at " +"which printing can already start." +msgstr "" +"Minimalna temperatura podczas podgrzewania do temperatury drukowania, przy " +"której można rozpocząć drukowanie." + +msgctxt "material_initial_print_temperature label" +msgid "Initial Printing Temperature" +msgstr "Początkowa temperatura druku" + +msgctxt "material_print_temp_prepend description" +msgid "" +"Whether to include nozzle temperature commands at the start of the gcode. " +"When the start_gcode already contains nozzle temperature commands Cura " +"frontend will automatically disable this setting." +msgstr "" +"Możliwość wstawienia polecenia do temperatury dyszy na początku kodu G. " +"Jeżeli start_gcode już zawiera polecenia do temperatury dyszy, program Cura " +"wyłączenie tego ustawienia automatyczne." + +msgctxt "material_print_temp_prepend label" +msgid "Include material temperatures" +msgstr "Uwzględnij temperaturę materiału" + +msgctxt "material_print_temp_wait description" +msgid "Whether to wait until the nozzle temperature is reached at the start." +msgstr "Poczekaj, aż temperatura dyszy zostanie osiągnięta na początku." + +msgctxt "material_print_temp_wait label" +msgid "Wait for nozzle heatup" +msgstr "Oczekiwanie na ogrzanie dyszy" + +msgctxt "material_print_temperature description" +msgid "The temperature used for printing." +msgstr "Temperatura stosowana do drukowania." + +msgctxt "material_print_temperature label" +msgid "Printing Temperature" +msgstr "Temperatura druku" + +msgctxt "material_print_temperature_layer_0 description" +msgid "" +"The temperature used for printing the first layer. Set at 0 to disable " +"special handling of the initial layer." +msgstr "" +"Temperatura stosowana do drukowania pierwszej warstwy. Ustaw wartość 0, aby " +"wyłączyć szczególną obsługę początkowej warstwy." + +msgctxt "material_print_temperature_layer_0 label" +msgid "Printing Temperature Initial Layer" +msgstr "Temperatura początkowej warstwy" + +msgctxt "material_standby_temperature description" +msgid "" +"The temperature of the nozzle when another nozzle is currently used for " +"printing." +msgstr "Temperatura dyszy, gdy inne dysze są obecnie używane do drukowania." + +msgctxt "material_standby_temperature label" +msgid "Standby Temperature" +msgstr "Temperatura w trybie czuwania" + +msgctxt "max_feedrate_z_override description" +msgid "" +"The maximum speed with which the build plate is moved. Setting this to zero " +"causes the print to use the firmware defaults for the maximum z speed." +msgstr "" +"Maksymalna prędkość przesuwu płyty nośnej. Ustawienie na zero powoduje, że " +"druk używa domyślnych ustawień oprogramowania dla maksymalnej prędkości z." + +msgctxt "max_feedrate_z_override label" +msgid "Maximum Z Speed" +msgstr "Prędkość maksymalna Z" + +msgctxt "max_skin_angle_for_expansion description" +msgid "" +"Top and/or bottom surfaces of your object with an angle larger than this " +"setting, won't have their top/bottom skin expanded. This avoids expanding " +"the narrow skin areas that are created when the model surface has a near " +"vertical slope. An angle of 0° is horizontal, while an angle of 90° is " +"vertical." +msgstr "" +"Górne i / lub dolne powierzchnie przedmiotu o kącie większym niż to " +"ustawienie nie będą miały rozszerzonego górnego / dolnego rozdarcia. Pozwala " +"to uniknąć powiększania wąskich obszarów ścian, które powstają, gdy " +"powierzchnia modelu ma w pobliżu pionowe nachylenie. Kąt 0 ° jest poziomy, a " +"kąt 90 ° jest pionowy." + +msgctxt "max_skin_angle_for_expansion label" +msgid "Maximum Skin Angle for Expansion" +msgstr "Maksymalny kąt rozciągania ścian" + +msgctxt "mesh_position_x description" +msgid "Offset applied to the object in the x direction." +msgstr "Przesunięcie wykorzystywane do obiektu w kierunku X" + +msgctxt "mesh_position_x label" +msgid "Mesh position x" +msgstr "Pozycja siatki X" + +msgctxt "mesh_position_y description" +msgid "Offset applied to the object in the y direction." +msgstr "Przesunięcie wykorzystywane do obiektu w kierunku Y." + +msgctxt "mesh_position_y label" +msgid "Mesh position y" +msgstr "Pozycja siatki Y" + +msgctxt "mesh_position_z description" +msgid "" +"Offset applied to the object in the z direction. With this you can perform " +"what was used to be called 'Object Sink'." +msgstr "" +"Przesunięcie wykorzystywane do obiektu w kierunku Z.. Aby wykonać procedurę " +"zastosowano „niższy obiekt” w znaczeniu." + +msgctxt "mesh_position_z label" +msgid "Mesh position z" +msgstr "Pozycja siatki Z" + +msgctxt "mesh_rotation_matrix description" +msgid "" +"Transformation matrix to be applied to the model when loading it from file." +msgstr "" +"Matryca transformacji, która ma być zastosowana do modelu podczas ładowania " +"z pliku." + +msgctxt "mesh_rotation_matrix label" +msgid "Mesh Rotation Matrix" +msgstr "Matryca rotacji siatki" + +msgctxt "meshfix description" +msgid "category_fixes" +msgstr "Poprawki kategorii" + +msgctxt "meshfix label" +msgid "Mesh Fixes" +msgstr "Poprawki siatki" + +msgctxt "meshfix_extensive_stitching description" +msgid "" +"Extensive stitching tries to stitch up open holes in the mesh by closing the " +"hole with touching polygons. This option can introduce a lot of processing " +"time." +msgstr "" +"Szerokie szwy próbują zszywać otwarte otwory w siatce przez zamknięcie " +"otworu dotykiem wielokątów. Ta opcja może znacznie wydłużyć czas " +"przetwarzania." + +msgctxt "meshfix_extensive_stitching label" +msgid "Extensive Stitching" +msgstr "Szerokie szwy" + +msgctxt "meshfix_keep_open_polygons description" +msgid "" +"Normally Cura tries to stitch up small holes in the mesh and remove parts of " +"a layer with big holes. Enabling this option keeps those parts which cannot " +"be stitched. This option should be used as a last resort option when " +"everything else fails to produce proper GCode." +msgstr "" +"Zwykle Cura próbuje zszywać małe dziury w siatce i usunąć części warstwy z " +"dużymi otworami. Włączenie tej opcji powoduje zatrzymanie tych części, " +"których nie można zszywać. Ta opcja powinna być używana jako ostatnia opcja, " +"gdy wszystko inne nie dostarczy właściwej GCode." + +msgctxt "meshfix_keep_open_polygons label" +msgid "Keep Disconnected Faces" +msgstr "Zachowaj rozłączone twarze" + +msgctxt "meshfix_union_all description" +msgid "" +"Ignore the internal geometry arising from overlapping volumes within a mesh " +"and print the volumes as one. This may cause unintended internal cavities to " +"disappear." +msgstr "" +"Zignoruj geometrię wewnętrzną wynikającą z nakładania się objętości w siatce " +"i wydrukuj ją jako jedną. Może to spowodować zniknięcie niezamierzonych " +"wewnętrznych ubytków." + +msgctxt "meshfix_union_all label" +msgid "Union Overlapping Volumes" +msgstr "Zwielokrotniające się tomy" + +msgctxt "meshfix_union_all_remove_holes description" +msgid "" +"Remove the holes in each layer and keep only the outside shape. This will " +"ignore any invisible internal geometry. However, it also ignores layer holes " +"which can be viewed from above or below." +msgstr "" +"Usuń otwory w każdej warstwie i zachowuj tylko zewnętrzny kształt. Zignoruje " +"to niewidoczną wewnętrzną geometrię. Ignoruje jednak otwory warstw, które " +"można oglądać z góry lub do dołu." + +msgctxt "meshfix_union_all_remove_holes label" +msgid "Remove All Holes" +msgstr "Usuń wszystkie otwory" + +msgctxt "min_infill_area description" +msgid "Don't generate areas of infill smaller than this (use skin instead)." +msgstr "" +"Nie wytwarzaj obszarów wypełnienia mniejszych niż ten (Zamiast tego używać " +"skóry)." + +msgctxt "min_infill_area label" +msgid "Minimum Infill Area" +msgstr "Minimalny obszar wypełnienia" + +msgctxt "min_skin_width_for_expansion description" +msgid "" +"Skin areas narrower than this are not expanded. This avoids expanding the " +"narrow skin areas that are created when the model surface has a slope close " +"to the vertical." +msgstr "" +"Obszary ściany, które są węższe niż minimalna szerokość nie zostanie " +"poszerzona. W ten sposób unika że obcisłe zewnętrzne obszary ścian są " +"rozszerzone, wynik, gdy powierzchnia modelu mającą niemal pionowe nachylenie." + +msgctxt "min_skin_width_for_expansion label" +msgid "Minimum Skin Width for Expansion" +msgstr "Minimalna szerokość zewnętrzna warstwa ekspansji" + +msgctxt "mold_angle description" +msgid "" +"The angle of overhang of the outer walls created for the mold. 0° will make " +"the outer shell of the mold vertical, while 90° will make the outside of the " +"model follow the contour of the model." +msgstr "" +"Kąt zwisania ścian zewnętrznych utworzonych dla formy. 0 ° spowoduje, że " +"powłoka zewnętrzna formy będzie pionowa, a 90 ° sprawi, że na zewnątrz " +"modelu znajdzie się kontur modelu." + +msgctxt "mold_angle label" +msgid "Mold Angle" +msgstr "Kąt formy" + +msgctxt "mold_enabled description" +msgid "" +"Print models as a mold, which can be cast in order to get a model which " +"resembles the models on the build plate." +msgstr "" +"Wydrukuj modele jako formę, którą można wyrzucić w celu uzyskania modelu, " +"który przypomina modele na płycie." + +msgctxt "mold_enabled label" +msgid "Mold" +msgstr "Forma" + +msgctxt "mold_roof_height description" +msgid "The height above horizontal parts in your model which to print mold." +msgstr "" +"Wysokość nad poziomymi częściami w modelu, które umożliwiają drukowanie " +"formy." + +msgctxt "mold_roof_height label" +msgid "Mold Roof Height" +msgstr "Wzrost wysokości dachu" + +msgctxt "mold_width description" +msgid "" +"The minimal distance between the ouside of the mold and the outside of the " +"model." +msgstr "" +"Minimalna odległość między zewnętrzną stroną śmiałego i zewnętrznego modelu." + +msgctxt "mold_width label" +msgid "Minimal Mold Width" +msgstr "Minimalna szerokość formy" + +msgctxt "multiple_mesh_overlap description" +msgid "" +"Make meshes which are touching each other overlap a bit. This makes them " +"bond together better." +msgstr "" +"Utwórz siatki, które się dotykają, zachodzą na siebie. To sprawia, że lepiej " +"się łączą." + +msgctxt "multiple_mesh_overlap label" +msgid "Merged Meshes Overlap" +msgstr "Połączone okręgi się pokrywają" + +msgctxt "nozzle_disallowed_areas description" +msgid "A list of polygons with areas the nozzle is not allowed to enter." +msgstr "Lista wielokątów z obszarami, na które dysze nie mogą wchodzić." + +msgctxt "nozzle_disallowed_areas label" +msgid "Nozzle Disallowed Areas" +msgstr "Obszary niedozwolone w dyszy" + +msgctxt "ooze_shield_angle description" +msgid "" +"The maximum angle a part in the ooze shield will have. With 0 degrees being " +"vertical, and 90 degrees being horizontal. A smaller angle leads to less " +"failed ooze shields, but more material." +msgstr "" +"Maksymalny kąt, jaki ma w osłonie osłony. Przy 0 stopniach jest pionowa i 90 " +"stopni w poziomie. Mniejszy kąt prowadzi do mniej nieudanych ekranów, ale " +"więcej materiału." + +msgctxt "ooze_shield_angle label" +msgid "Ooze Shield Angle" +msgstr "Kąt osłony tarcia" + +msgctxt "ooze_shield_dist description" +msgid "Distance of the ooze shield from the print, in the X/Y directions." +msgstr "Odległość od osłony śluzu od nadruku, w kierunkach X / Y." + +msgctxt "ooze_shield_dist label" +msgid "Ooze Shield Distance" +msgstr " Odległość osłony tarczy" + +msgctxt "ooze_shield_enabled description" +msgid "" +"Enable exterior ooze shield. This will create a shell around the model which " +"is likely to wipe a second nozzle if it's at the same height as the first " +"nozzle." +msgstr "" +"Włączyć zewnętrzną osłonę. Powstanie powłoka wokół modelu, która " +"prawdopodobnie wycierpie drugą dyszę, jeśli jest na tej samej wysokości, co " +"pierwsza dysza." + +msgctxt "ooze_shield_enabled label" +msgid "Enable Ooze Shield" +msgstr "Włącz osłony tarcia" + +msgctxt "outer_inset_first description" +msgid "" +"Prints walls in order of outside to inside when enabled. This can help " +"improve dimensional accuracy in X and Y when using a high viscosity plastic " +"like ABS; however it can decrease outer surface print quality, especially on " +"overhangs." +msgstr "" +"Drukuje ściany w kolejności od zewnątrz do wewnątrz, gdy jest włączona. Może " +"to poprawić dokładność wymiarów w modelach X i Y przy użyciu plastiku o " +"wysokiej lepkości, takiego jak ABS; Może jednak zmniejszyć jakość druku " +"zewnętrznego, zwłaszcza na zwisach." + +msgctxt "outer_inset_first label" +msgid "Outer Before Inner Walls" +msgstr "Zewnętrzne przed ścianami wewnętrznymi" + +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "Przyczepność" + +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "Zbuduj przyczepność płyt" + +msgctxt "prime_blob_enable description" +msgid "" +"Whether to prime the filament with a blob before printing. Turning this " +"setting on will ensure that the extruder will have material ready at the " +"nozzle before printing. Printing Brim or Skirt can act like priming too, in " +"which case turning this setting off saves some time." +msgstr "" +"Czy przenieść włókno z blobem przed drukowaniem. Po włączeniu tego " +"ustawienia upewnij się, że wytłaczarka ma materiał gotowy do dyszy przed " +"drukowaniem. Drukowanie Brim lub Skirt może działać jak gruntowanie, w takim " +"przypadku wyłączenie tego ustawienia oszczędza trochę czasu." + +msgctxt "prime_blob_enable label" +msgid "Enable Prime Blob" +msgstr "Włącz Prime Blob" + +msgctxt "prime_tower_enable description" +msgid "" +"Print a tower next to the print which serves to prime the material after " +"each nozzle switch." +msgstr "" +"Wydrukuj wieżę obok wydruku, która służy do napełniania materiału po każdym " +"przełączniku dyszy." + +msgctxt "prime_tower_enable label" +msgid "Enable Prime Tower" +msgstr "Włącz Prime Tower" + +msgctxt "prime_tower_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "" +"Kompensacja przepływu: ilość materiału wytłaczanego jest mnożona przez tę " +"wartość." + +msgctxt "prime_tower_flow label" +msgid "Prime Tower Flow" +msgstr "Przepływ/Flow Prime Tower " + +msgctxt "prime_tower_line_width description" +msgid "Width of a single prime tower line." +msgstr "Szerokość pojedynczej linii wieży." + +msgctxt "prime_tower_line_width label" +msgid "Prime Tower Line Width" +msgstr "Szerokość linii rzędu głównej wieży" + +msgctxt "prime_tower_min_volume description" +msgid "" +"The minimum volume for each layer of the prime tower in order to purge " +"enough material." +msgstr "" +"Minimalna objętość każdej warstwy wieży podstawowej w celu oczyszczenia " +"wystarczającego materiału." + +msgctxt "prime_tower_min_volume label" +msgid "Prime Tower Minimum Volume" +msgstr "Minimalna objętość Prime Tower" + +msgctxt "prime_tower_position_x description" +msgid "The x coordinate of the position of the prime tower." +msgstr "Współrzędna X położenia pierwszej wieży." + +msgctxt "prime_tower_position_x label" +msgid "Prime Tower X Position" +msgstr "Pozycja Prime Tower X" + +msgctxt "prime_tower_position_y description" +msgid "The y coordinate of the position of the prime tower." +msgstr "Współrzędna Y położenia pierwszej wieży." + +msgctxt "prime_tower_position_y label" +msgid "Prime Tower Y Position" +msgstr "Pozycja Prime Tower Y" + +msgctxt "prime_tower_size description" +msgid "The width of the prime tower." +msgstr "Szerokość wieży głównej." + +msgctxt "prime_tower_size label" +msgid "Prime Tower Size" +msgstr "Rozmiar Prime Tower" + +msgctxt "prime_tower_wall_thickness description" +msgid "" +"The thickness of the hollow prime tower. A thickness larger than half the " +"Prime Tower Minimum Volume will result in a dense prime tower." +msgstr "" +"Grubość pustej wieży. Grubość większa niż połowa minimalnej objętości Prime " +"Tower spowoduje, że wieża o dużej gęstości." + +msgctxt "prime_tower_wall_thickness label" +msgid "Prime Tower Thickness" +msgstr "Grubość Prime Tower" + +msgctxt "prime_tower_wipe_enabled description" +msgid "" +"After printing the prime tower with one nozzle, wipe the oozed material from " +"the other nozzle off on the prime tower." +msgstr "" +"Po wydrukowaniu podstawowej wieży jedną dyszą przetrzyj wytłoczony materiał " +"z drugiej dyszy na główną wieżę." + +msgctxt "prime_tower_wipe_enabled label" +msgid "Wipe Inactive Nozzle on Prime Tower" +msgstr "Wytrzeć nieaktywną dyszę na Prime Tower" + +msgctxt "print_sequence description" +msgid "" +"Whether to print all models one layer at a time or to wait for one model to " +"finish, before moving on to the next. One at a time mode is only possible if " +"all models are separated in such a way that the whole print head can move in " +"between and all models are lower than the distance between the nozzle and " +"the X/Y axes." +msgstr "" +"Czy drukować wszystkie modele po jednej warstwie lub poczekać na zakończenie " +"jednego modelu, zanim przejdziesz do następnego. Jedno w trybie czasu jest " +"możliwe tylko wtedy, gdy wszystkie modele są oddzielone w taki sposób, aby " +"cała głowica drukująca mogła się poruszać między wszystkimi modelami niższa " +"niż odległość między dyszą a osiami X / Y." + +msgctxt "print_sequence label" +msgid "Print Sequence" +msgstr "Wydrukuj sekwencję" + +msgctxt "print_sequence option all_at_once" +msgid "All at Once" +msgstr "Wszystko na raz" + +msgctxt "print_sequence option one_at_a_time" +msgid "One at a Time" +msgstr "Jedno na raz" + +msgctxt "raft_acceleration description" +msgid "The acceleration with which the raft is printed." +msgstr "Przyspieszenie, z jakim tratwa jest wydrukowana." + +msgctxt "raft_acceleration label" +msgid "Raft Print Acceleration" +msgstr "Przyspieszenie druku tratwy" + +msgctxt "raft_airgap description" +msgid "" +"The gap between the final raft layer and the first layer of the model. Only " +"the first layer is raised by this amount to lower the bonding between the " +"raft layer and the model. Makes it easier to peel off the raft." +msgstr "" +"Różnica między końcową warstwą tratwy a pierwszą warstwą modelu. Tylko ta " +"pierwsza warstwa jest podnoszona o tę ilość w celu zmniejszenia wiązania " +"pomiędzy warstwą tratwą a modelem. Ułatwia odrywanie tratwy." + +msgctxt "raft_airgap label" +msgid "Raft Air Gap" +msgstr "Luki w powietrzu" + +msgctxt "raft_base_acceleration description" +msgid "The acceleration with which the base raft layer is printed." +msgstr "Przyspieszenie, z jaką drukowana jest warstwa podstawowej tratwy." + +msgctxt "raft_base_acceleration label" +msgid "Raft Base Print Acceleration" +msgstr "Przyspieszenie druku tratwy bazy" + +msgctxt "raft_base_fan_speed description" +msgid "The fan speed for the base raft layer." +msgstr "Prędkość wentylatora dla podstawowej warstwy tratwy." + +msgctxt "raft_base_fan_speed label" +msgid "Raft Base Fan Speed" +msgstr "Prędkość wentylatora podstawy tratwy" + +msgctxt "raft_base_jerk description" +msgid "The jerk with which the base raft layer is printed." +msgstr "Funkcja szarpnięcie w której dolna warstwa Tratwa wydrukowaniu." + +msgctxt "raft_base_jerk label" +msgid "Raft Base Print Jerk" +msgstr "Funkcja Print szarpnięcie baza Tratwa" + +msgctxt "raft_base_line_spacing description" +msgid "" +"The distance between the raft lines for the base raft layer. Wide spacing " +"makes for easy removal of the raft from the build plate." +msgstr "" +"Odległość pomiędzy linami tratwiowymi dla warstwy podstawowej tratwy. " +"Szerokie odstępy ułatwiają usuwanie tratwy z płytki." + +msgctxt "raft_base_line_spacing label" +msgid "Raft Line Spacing" +msgstr "Rozstaw linii tratw" + +msgctxt "raft_base_line_width description" +msgid "" +"Width of the lines in the base raft layer. These should be thick lines to " +"assist in build plate adhesion." +msgstr "" +"Szerokość linii w podstawowej warstwie tratwy. Powinny być to grube linie, " +"które pomogą w przyczepianiu do płyt budowlanych." + +msgctxt "raft_base_line_width label" +msgid "Raft Base Line Width" +msgstr "Szerokość linii podstawy tratwy" + +msgctxt "raft_base_speed description" +msgid "" +"The speed at which the base raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"Prędkość, w jakiej jest wydrukowana warstwa podstawowej tratwy. Powinno być " +"drukowane dość wolno, ponieważ objętość materiału wydobywającego się z dyszy " +"jest dość duża." + +msgctxt "raft_base_speed label" +msgid "Raft Base Print Speed" +msgstr "Prędkość druku do bazy tratwy" + +msgctxt "raft_base_thickness description" +msgid "" +"Layer thickness of the base raft layer. This should be a thick layer which " +"sticks firmly to the printer build plate." +msgstr "" +"Grubość warstwy podstawowej warstwy tratwy. Powinna to być gruba warstwa, " +"która mocno przykleja się do płyty do budowy drukarki." + +msgctxt "raft_base_thickness label" +msgid "Raft Base Thickness" +msgstr "Grubość podstawy tratwy" + +msgctxt "raft_fan_speed description" +msgid "The fan speed for the raft." +msgstr "Prędkość wentylatora dla tratwy." + +msgctxt "raft_fan_speed label" +msgid "Raft Fan Speed" +msgstr "Prędkość wentylatora dla tratwy" + +msgctxt "raft_interface_acceleration description" +msgid "The acceleration with which the middle raft layer is printed." +msgstr "Przyspieszenie, z jaką drukuje się środkową warstwę tratwy." + +msgctxt "raft_interface_acceleration label" +msgid "Raft Middle Print Acceleration" +msgstr "Przyspieszenie drukowania środkowego tratwy" + +msgctxt "raft_interface_fan_speed description" +msgid "The fan speed for the middle raft layer." +msgstr "Prędkość wentylatora dla środkowej warstwy tratwy." + +msgctxt "raft_interface_fan_speed label" +msgid "Raft Middle Fan Speed" +msgstr "Średnia szybkość wentylatora tratwy" + +msgctxt "raft_interface_jerk description" +msgid "The jerk with which the middle raft layer is printed." +msgstr "Funkcja (jerk) z których środkowe warstwy tratwy są drukowane." + +msgctxt "raft_interface_jerk label" +msgid "Raft Middle Print Jerk" +msgstr "Funkcja Print Center Tratwa Jerk" + +msgctxt "raft_interface_line_spacing description" +msgid "" +"The distance between the raft lines for the middle raft layer. The spacing " +"of the middle should be quite wide, while being dense enough to support the " +"top raft layers." +msgstr "" +"Odległość między linami tratującymi dla środkowej warstwy tratwy. Odległość " +"środkowa powinna być dość szeroka, a jednocześnie wystarczająco gęsta, aby " +"podtrzymywać górne warstwy tratwy." + +msgctxt "raft_interface_line_spacing label" +msgid "Raft Middle Spacing" +msgstr "Odległość między środkiem a tratwą" + +msgctxt "raft_interface_line_width description" +msgid "" +"Width of the lines in the middle raft layer. Making the second layer extrude " +"more causes the lines to stick to the build plate." +msgstr "" +"Szerokość linii w środkowej warstwie tratwy. Wytłaczanie drugiej warstwy " +"powoduje, że linie przyklejają się do płyty." + +msgctxt "raft_interface_line_width label" +msgid "Raft Middle Line Width" +msgstr "Szerokość tratwy środkowej" + +msgctxt "raft_interface_speed description" +msgid "" +"The speed at which the middle raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"Prędkość, z jaką drukuje się środkową warstwę tratwy. Powinno być drukowane " +"dość wolno, ponieważ objętość materiału wydobywającego się z dyszy jest dość " +"duża." + +msgctxt "raft_interface_speed label" +msgid "Raft Middle Print Speed" +msgstr "Prędkość druku centrum Tratwa" + +msgctxt "raft_interface_thickness description" +msgid "Layer thickness of the middle raft layer." +msgstr "Grubość warstwy środkowej warstwy tratwy." + +msgctxt "raft_interface_thickness label" +msgid "Raft Middle Thickness" +msgstr "Średnia grubość tratwy" + +msgctxt "raft_jerk description" +msgid "The jerk with which the raft is printed." +msgstr "Funkcja jerk, z którym tratwa zostanie wydrukowany." + +msgctxt "raft_jerk label" +msgid "Raft Print Jerk" +msgstr "Funkcja szarpnięcie(jerk) Tratwa Drukuj" + +msgctxt "raft_margin description" +msgid "" +"If the raft is enabled, this is the extra raft area around the model which " +"is also given a raft. Increasing this margin will create a stronger raft " +"while using more material and leaving less area for your print." +msgstr "" +"Jeśli tratwa jest włączona, jest to dodatkowy obszar tratwy wokół modelu, " +"który ma również tratwę. Zwiększenie marginesu zwiększy tratwę podczas " +"korzystania z większej ilości materiału i pozostawia mniej miejsca na wydruk." + +msgctxt "raft_margin label" +msgid "Raft Extra Margin" +msgstr "Dodatkowa odległość do Tratwy" + +msgctxt "raft_speed description" +msgid "The speed at which the raft is printed." +msgstr "Prędkość, w jakiej tratwa jest drukowana." + +msgctxt "raft_speed label" +msgid "Raft Print Speed" +msgstr "Prędkość druku tratwy" + +msgctxt "raft_surface_acceleration description" +msgid "The acceleration with which the top raft layers are printed." +msgstr "Przyspieszenie, z jaką drukowane są górne warstwy tratwy." + +msgctxt "raft_surface_acceleration label" +msgid "Raft Top Print Acceleration" +msgstr "Przyspieszenie druku górnej wartwy tratwy" + +msgctxt "raft_surface_fan_speed description" +msgid "The fan speed for the top raft layers." +msgstr "Prędkość wentylatora dla górnej warstwy tratwy." + +msgctxt "raft_surface_fan_speed label" +msgid "Raft Top Fan Speed" +msgstr "Szybkość wentylatora górnej warstwy tratwy" + +msgctxt "raft_surface_jerk description" +msgid "The jerk with which the top raft layers are printed." +msgstr "Przyśpieszenie(jerk), z którym są drukowane górne warstwy tratwy." + +msgctxt "raft_surface_jerk label" +msgid "Raft Top Print Jerk" +msgstr "Góra tratwy przyśpieszenie (Jerk)" + +msgctxt "raft_surface_layers description" +msgid "" +"The number of top layers on top of the 2nd raft layer. These are fully " +"filled layers that the model sits on. 2 layers result in a smoother top " +"surface than 1." +msgstr "" +"Liczba górnych warstw na górze drugiej warstwy tratwy. Są to w pełni " +"wypełnione warstwy, na których siedzi model. 2 warstwy tworzą gładszą górną " +"powierzchnię niż 1." + +msgctxt "raft_surface_layers label" +msgid "Raft Top Layers" +msgstr "Warstwy górnej tratwy" + +msgctxt "raft_surface_line_spacing description" +msgid "" +"The distance between the raft lines for the top raft layers. The spacing " +"should be equal to the line width, so that the surface is solid." +msgstr "" +"Odległość między tratwami dla górnej warstwy tratwy. Rozstaw powinien być " +"równy szerokości linii, tak że powierzchnia jest stała." + +msgctxt "raft_surface_line_spacing label" +msgid "Raft Top Spacing" +msgstr "Rozstaw górny tratw" + +msgctxt "raft_surface_line_width description" +msgid "" +"Width of the lines in the top surface of the raft. These can be thin lines " +"so that the top of the raft becomes smooth." +msgstr "" +"Szerokość linii w górnej powierzchni tratwy. Mogą to być cienkie linie tak, " +"aby góra tratwy była gładka." + +msgctxt "raft_surface_line_width label" +msgid "Raft Top Line Width" +msgstr "Szerokość linii górnej tratwy" + +msgctxt "raft_surface_speed description" +msgid "" +"The speed at which the top raft layers are printed. These should be printed " +"a bit slower, so that the nozzle can slowly smooth out adjacent surface " +"lines." +msgstr "" +"Prędkość, w jakiej są drukowane górne warstwy tratwy. Powinny być drukowane " +"nieco wolniej, dzięki czemu dysza może powoli wypolerować sąsiednie linie " +"powierzchni." + +msgctxt "raft_surface_speed label" +msgid "Raft Top Print Speed" +msgstr "Górna szybkość druku tratwy" + +msgctxt "raft_surface_thickness description" +msgid "Layer thickness of the top raft layers." +msgstr "Grubość warstwy górnej warstwy tratwy." + +msgctxt "raft_surface_thickness label" +msgid "Raft Top Layer Thickness" +msgstr "Grubość warstwy tratwy" + +msgctxt "resolution description" +msgid "" +"All settings that influence the resolution of the print. These settings have " +"a large impact on the quality (and print time)" +msgstr "" +"Wszystkie ustawienia, które wpływają na rozdzielczość druku. Ustawienia te " +"mają ogromny wpływ na jakość kompresji (zmęczenie)." + +msgctxt "resolution label" +msgid "Quality" +msgstr "Jakość" + +msgctxt "retract_at_layer_change description" +msgid "Retract the filament when the nozzle is moving to the next layer." +msgstr "Cofnij filament, gdy dysza przesuwa się do następnej warstwy." + +msgctxt "retract_at_layer_change label" +msgid "Retract at Layer Change" +msgstr "Poruszać się ze zmianą warstwy" + +msgctxt "retraction_amount description" +msgid "The length of material retracted during a retraction move." +msgstr "Długość materiału wycofanego podczas przesuwania." + +msgctxt "retraction_amount label" +msgid "Retraction Distance" +msgstr "Długość cofania filamentu" + +msgctxt "retraction_combing description" +msgid "" +"Combing keeps the nozzle within already printed areas when traveling. This " +"results in slightly longer travel moves but reduces the need for " +"retractions. If combing is off, the material will retract and the nozzle " +"moves in a straight line to the next point. It is also possible to avoid " +"combing over top/bottom skin areas by combing within the infill only." +msgstr "" +"Kombinacja utrzymuje dyszę w już zadrukowanych obszarach podczas podróży. " +"Powoduje to nieco dłuższe ruchy podróży, ale zmniejsza potrzebę wycofania. " +"Jeśli czesanie jest wyłączone, materiał się cofa, a dysza przemieszcza się w " +"prostej linii do następnego punktu. Można też unikać czesania górnych / " +"dolnych obszarów skóry przez czesanie wewnątrz wypełnienia." + +msgctxt "retraction_combing label" +msgid "Combing Mode" +msgstr "Tryb łączenia" + +msgctxt "retraction_combing option all" +msgid "All" +msgstr "Wszystko" + +msgctxt "retraction_combing option noskin" +msgid "No Skin" +msgstr "Bez poszycia zewnętrznego" + +msgctxt "retraction_combing option off" +msgid "Off" +msgstr "Poza" + +msgctxt "retraction_count_max description" +msgid "" +"This setting limits the number of retractions occurring within the minimum " +"extrusion distance window. Further retractions within this window will be " +"ignored. This avoids retracting repeatedly on the same piece of filament, as " +"that can flatten the filament and cause grinding issues." +msgstr "" +"To ustawienie ogranicza liczbę wycofań występujących w minimalnym oknie " +"odległości wyciskania. Dalsze wycofania w tym oknie zostaną zignorowane. " +"Pozwala to uniknąć wielokrotnego opuszczania na tym samym kawałku żarnika, " +"ponieważ może spłaszczyć włókno i powodować problemy z wyciskaniem filamentu." + +msgctxt "retraction_count_max label" +msgid "Maximum Retraction Count" +msgstr "Maksymalna liczba wycofania" + +msgctxt "retraction_enable description" +msgid "" +"Retract the filament when the nozzle is moving over a non-printed area. " +msgstr "" +"Cofnij włókno, gdy dysza porusza się nad obszarem, w którym nie jest " +"zadrukowany." + +msgctxt "retraction_enable label" +msgid "Enable Retraction" +msgstr "Włącz wycofanie" + +msgctxt "retraction_extra_prime_amount description" +msgid "" +"Some material can ooze away during a travel move, which can be compensated " +"for here." +msgstr "" +"Podczas przemieszczania przez nie obszaru drukowania materiałów mogą " +"wypływać z dala, które mogą być kompensowane tutaj." + +msgctxt "retraction_extra_prime_amount label" +msgid "Retraction Extra Prime Amount" +msgstr "Dodatkowa retrakcja Push-back " + +msgctxt "retraction_extrusion_window description" +msgid "" +"The window in which the maximum retraction count is enforced. This value " +"should be approximately the same as the retraction distance, so that " +"effectively the number of times a retraction passes the same patch of " +"material is limited." +msgstr "" +"Okno, w którym maksymalna liczba wycofania jest wymuszona. Wartość ta " +"powinna być w przybliżeniu taka sama jak odległość wycofania, dzięki czemu " +"skutecznie liczba razy cofnięcie przebiega przez tę samą warstwę materiału " +"jest ograniczona." + +msgctxt "retraction_extrusion_window label" +msgid "Minimum Extrusion Distance Window" +msgstr "Minimalna odległość Okno wytłaczania" + +msgctxt "retraction_hop description" +msgid "The height difference when performing a Z Hop." +msgstr "Różnica w wysokości podczas wykonywania Z-skok." + +msgctxt "retraction_hop label" +msgid "Z Hop Height" +msgstr "Wysokość skoku Z" + +msgctxt "retraction_hop_after_extruder_switch description" +msgid "" +"After the machine switched from one extruder to the other, the build plate " +"is lowered to create clearance between the nozzle and the print. This " +"prevents the nozzle from leaving oozed material on the outside of a print." +msgstr "" +"Po przełączeniu maszyny z jednej wytłaczarki na drugą, płyta konstrukcyjna " +"jest opuszczana, aby utworzyć luz pomiędzy dyszy a drukiem. Zapobiega to " +"wypływaniu dyszy z wypchanego materiału na zewnątrz wydruku." + +msgctxt "retraction_hop_after_extruder_switch label" +msgid "Z Hop After Extruder Switch" +msgstr "Przełącznik wytłaczarki Z skok" + +msgctxt "retraction_hop_enabled description" +msgid "" +"Whenever a retraction is done, the build plate is lowered to create " +"clearance between the nozzle and the print. It prevents the nozzle from " +"hitting the print during travel moves, reducing the chance to knock the " +"print from the build plate." +msgstr "" +"Zawsze, gdy następuje wycofanie, płyta konstrukcyjna jest opuszczana w celu " +"utworzenia luzu między dyszą a drukiem. Zapobiega to uderzeniu dyszy w ruch " +"podczas podróży, co zmniejsza szanse wybicia wydruku z płyty." + +msgctxt "retraction_hop_enabled label" +msgid "Z Hop When Retracted" +msgstr "Z-skok podczas wciągania" + +msgctxt "retraction_hop_only_when_collides description" +msgid "" +"Only perform a Z Hop when moving over printed parts which cannot be avoided " +"by horizontal motion by Avoid Printed Parts when Traveling." +msgstr "" +"Podczas przesuwania się nad drukowanymi częściami, które nie da się uniknąć " +"w ruchu poziomej, wykonaj Z-skok tylko unikając drukowanych części podczas " +"podróży." + +msgctxt "retraction_hop_only_when_collides label" +msgid "Z Hop Only Over Printed Parts" +msgstr "Z-skok tylko nad drukowanymi częściami" + +msgctxt "retraction_min_travel description" +msgid "" +"The minimum distance of travel needed for a retraction to happen at all. " +"This helps to get fewer retractions in a small area." +msgstr "" +"Minimalna odległość podróży potrzebna do wycofania się w ogóle. To pomaga " +"uzyskać mniej retractions w małym obszarze." + +msgctxt "retraction_min_travel label" +msgid "Retraction Minimum Travel" +msgstr "Minimalny przejazd dla retrakcji" + +msgctxt "retraction_prime_speed description" +msgid "The speed at which the filament is primed during a retraction move." +msgstr "Prędkość, przy której dysza jest przesunięta w czasie ruchu cofania." + +msgctxt "retraction_prime_speed label" +msgid "Retraction Prime Speed" +msgstr "Wysoka prędkość wycofania retrakcji" + +msgctxt "retraction_retract_speed description" +msgid "The speed at which the filament is retracted during a retraction move." +msgstr "Prędkość, z jaką włókna są wycofywane podczas ruchu wycofania." + +msgctxt "retraction_retract_speed label" +msgid "Retraction Retract Speed" +msgstr "Prędkość wycofania retrakcji" + +msgctxt "retraction_speed description" +msgid "" +"The speed at which the filament is retracted and primed during a retraction " +"move." +msgstr "" +"Prędkość, z jaką włókna są wycofywane i zagruntowane podczas ruchu " +"wycofywania." + +msgctxt "retraction_speed label" +msgid "Retraction Speed" +msgstr "Prędkość wycofania" + +msgctxt "shell description" +msgid "Shell" +msgstr "Szkielet" + +msgctxt "shell label" +msgid "Shell" +msgstr "Szkielet" + +msgctxt "skin_alternate_rotation description" +msgid "" +"Alternate the direction in which the top/bottom layers are printed. Normally " +"they are printed diagonally only. This setting adds the X-only and Y-only " +"directions." +msgstr "" +"Kierunek, w którym górne / dolne warstwy są drukowane są zmieniane. " +"Zazwyczaj są one drukowane na ukos. Ustawienie to zwiększa tylko X i Y tylko " +"kierunku." + +msgctxt "skin_alternate_rotation label" +msgid "Alternate Skin Rotation" +msgstr "Zmiana obrotów zewnętrznego pokrycia" + +msgctxt "skin_angles description" +msgid "" +"A list of integer line directions to use when the top/bottom layers use the " +"lines or zig zag pattern. Elements from the list are used sequentially as " +"the layers progress and when the end of the list is reached, it starts at " +"the beginning again. The list items are separated by commas and the whole " +"list is contained in square brackets. Default is an empty list which means " +"use the traditional default angles (45 and 135 degrees)." +msgstr "" +"Lista kierunków linii całkowitych używanych, gdy warstwy górne / dolne " +"używają linii lub wzoru zygzakowego. Elementy z listy są używane kolejno w " +"miarę postępu warstw, a kiedy kończy się lista, zaczyna się od początku. " +"Elementy listy są oddzielone przecinkami, a cała lista znajduje się w " +"nawiasach kwadratowych. Domyślnie jest pusta lista, która oznacza tradycyjne " +"domyślne kąty (45 i 135 stopni)." + +msgctxt "skin_angles label" +msgid "Top/Bottom Line Directions" +msgstr "Kierunki górnej / dolnej linii" + +msgctxt "skin_line_width description" +msgid "Width of a single top/bottom line." +msgstr "Szerokość pojedynczej górnej / dolnej linii." + +msgctxt "skin_line_width label" +msgid "Top/Bottom Line Width" +msgstr "Szerokość górnej / dolnej linii" + +msgctxt "skin_no_small_gaps_heuristic description" +msgid "" +"When the model has small vertical gaps, about 5% extra computation time can " +"be spent on generating top and bottom skin in these narrow spaces. In such " +"case, disable the setting." +msgstr "" +"Jeśli model ma małe, pionowe szczeliny, to w tych wąskich przestrzeniach " +"można wydać około 5% dodatkowego czasu obliczeniowego. W takim przypadku " +"wyłączyć ustawienie." + +msgctxt "skin_no_small_gaps_heuristic label" +msgid "Ignore Small Z Gaps" +msgstr "Zignoruj małe luki Z" + +msgctxt "skin_outline_count description" +msgid "" +"Replaces the outermost part of the top/bottom pattern with a number of " +"concentric lines. Using one or two lines improves roofs that start on infill " +"material." +msgstr "" +"Zastępuje najbardziej zewnętrzną część wzoru górnego / dolnego za pomocą " +"kilku koncentrycznych linii. Korzystanie z jednej lub dwóch linii poprawia " +"dachy, które zaczynają się od materiału wypełniającego." + +msgctxt "skin_outline_count label" +msgid "Extra Skin Wall Count" +msgstr "Numer linii dodatkowej zewnętrznej skóry" + +msgctxt "skin_overlap description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "" +"Ilość nakładania się powłoki zewnętrznej i ścian. Lekkie nałożenie pozwala " +"ściśle łączyć się z powłoką zewnętrzną" + +msgctxt "skin_overlap label" +msgid "Skin Overlap Percentage" +msgstr "Zakładka nakładania powłoki zewnętrznej" + +msgctxt "skin_overlap_mm description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "" +"Ilość nakładania powłoki i ścian. Lekkie nałożenie pozwala ściśle łączyć się " +"ze powłoką." + +msgctxt "skin_overlap_mm label" +msgid "Skin Overlap" +msgstr "Nasunięcie się warstw na siebie powłoki zewnętrznej" + +msgctxt "skirt_brim_line_width description" +msgid "Width of a single skirt or brim line." +msgstr "Szerokość pojedynczej linii Skirt lub Brim" + +msgctxt "skirt_brim_line_width label" +msgid "Skirt/Brim Line Width" +msgstr "Skirt(Spódnica)-/Brim(rondo)-Szerokość linii" + +msgctxt "skirt_brim_minimal_length description" +msgid "" +"The minimum length of the skirt or brim. If this length is not reached by " +"all skirt or brim lines together, more skirt or brim lines will be added " +"until the minimum length is reached. Note: If the line count is set to 0 " +"this is ignored." +msgstr "" +"Minimalna długość obwódki lub obrzeża. Jeśli ta długość nie zostanie " +"osiągnięta przez całą linie obwodową lub obwódkę, należy dodać więcej linii " +"brzegowych, aż do osiągnięcia minimalnej długości. Uwaga: Jeśli liczba " +"wierszy jest ustawiona na 0, to jest ignorowana." + +msgctxt "skirt_brim_minimal_length label" +msgid "Skirt/Brim Minimum Length" +msgstr "Minimalna długość Obwódki/Obrzeża Skirt/Brim" + +msgctxt "skirt_brim_speed description" +msgid "" +"The speed at which the skirt and brim are printed. Normally this is done at " +"the initial layer speed, but sometimes you might want to print the skirt or " +"brim at a different speed." +msgstr "" +"Prędkość, z jaką jest drukowana spódnica i brzeg-obręcz (Skirt/Brim). Zwykle " +"jest to wykonywane przy początkowej szybkości warstwy, ale czasami można " +"wydrukować spódnicę lub obręcz przy innej prędkości." + +msgctxt "skirt_brim_speed label" +msgid "Skirt/Brim Speed" +msgstr "Prędkość Skirt/Brim" + +msgctxt "skirt_gap description" +msgid "" +"The horizontal distance between the skirt and the first layer of the print.\n" +"This is the minimum distance, multiple skirt lines will extend outwards from " +"this distance." +msgstr "" +"Pozioma odległość między linią wokół modelu a pierwszą warstwą nadruku.\n" +"Jest to o minimalnej odległości. Z tej odległości linie montowane są w " +"zewnętrznym kierunku." + +msgctxt "skirt_gap label" +msgid "Skirt Distance" +msgstr "Odległość obwódki od modelu" + +msgctxt "skirt_line_count description" +msgid "" +"Multiple skirt lines help to prime your extrusion better for small models. " +"Setting this to 0 will disable the skirt." +msgstr "" +"Liczne linie wokół pomagają w lepszym wytłaczaniu małych modeli. Ustawienie " +"na 0 spowoduje wyłączenie obwódki." + +msgctxt "skirt_line_count label" +msgid "Skirt Line Count" +msgstr "Obwódka liczba linii" + +msgctxt "smooth_spiralized_contours description" +msgid "" +"Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-" +"seam should be barely visible on the print but will still be visible in the " +"layer view). Note that smoothing will tend to blur fine surface details." +msgstr "" +"Wygładź kontur spirali, aby zmniejszyć widoczność szwu Z (szkielet Z " +"powinien być ledwo widoczny na wydruku, ale nadal będzie widoczny w widoku " +"warstwy). Należy pamiętać, że wygładzanie będzie miało tendencję do rozmycia " +"drobnych szczegółów powierzchni." + +msgctxt "smooth_spiralized_contours label" +msgid "Smooth Spiralized Contours" +msgstr "Gładkie Spiralne kontury" + +msgctxt "spaghetti_flow description" +msgid "" +"Adjusts the density of the spaghetti infill. Note that the Infill Density " +"only controls the line spacing of the filling pattern, not the amount of " +"extrusion for spaghetti infill." +msgstr "" +"Dostosowuje gęstość wypełnienia spaghetti. Należy zauważyć, że Gęstość " +"wypełnienia tylko kontroluje rozstaw linii wzoru napełniania, a nie ilość " +"wytłaczania wypełnienia spaghetti." + +msgctxt "spaghetti_flow label" +msgid "Spaghetti Flow" +msgstr "Spaghetti-przepływ" + +msgctxt "spaghetti_infill_enabled description" +msgid "" +"Print the infill every so often, so that the filament will curl up " +"chaotically inside the object. This reduces print time, but the behaviour is " +"rather unpredictable." +msgstr "" +"Drukowanie wypełnienia tak często, aby włókno zwisało chaotycznie wewnątrz " +"przedmiotu. Zmniejsza to czas drukowania, ale zachowanie jest raczej " +"nieprzewidywalne." + +msgctxt "spaghetti_infill_enabled label" +msgid "Spaghetti Infill" +msgstr "Spaghetti wypełnienia" + +msgctxt "spaghetti_inset description" +msgid "" +"The offset from the walls from where the spaghetti infill will be printed." +msgstr "" +"Odsunięcie od ścian, od których będzie drukowane wypełnienie spaghetti." + +msgctxt "spaghetti_inset label" +msgid "Spaghetti Inset" +msgstr "Spaghetti-wkład" + +msgctxt "spaghetti_max_height description" +msgid "" +"The maximum height of inside space which can be combined and filled from the " +"top." +msgstr "" +"Maksymalna wysokość przestrzeni wewnętrznej, którą można łączyć i napełniać " +"z góry." + +msgctxt "spaghetti_max_height label" +msgid "Spaghetti Infill Maximum Height" +msgstr "Spaghetti wypełnia maksymalną wysokość" + +msgctxt "spaghetti_max_infill_angle description" +msgid "" +"The maximum angle w.r.t. the Z axis of the inside of the print for areas " +"which are to be filled with spaghetti infill afterwards. Lowering this value " +"causes more angled parts in your model to be filled on each layer." +msgstr "" +"Maksymalny kąt w.r.t. Oś Z wewnątrz wydruku dla obszarów, które mają być " +"wypełnione wypełnieniem spaghetti. Obniżenie tej wartości powoduje, że na " +"każdym wariancie zostaną wypełnione więcej części pod kątem w modelu." + +msgctxt "spaghetti_max_infill_angle label" +msgid "Spaghetti Maximum Infill Angle" +msgstr "Spaghetti maksymalny kąt wypełnienia" + +msgctxt "speed description" +msgid "Speed" +msgstr "Prędkość" + +msgctxt "speed label" +msgid "Speed" +msgstr "Prędkość" + +msgctxt "speed_equalize_flow_enabled description" +msgid "" +"Print thinner than normal lines faster so that the amount of material " +"extruded per second remains the same. Thin pieces in your model might " +"require lines printed with smaller line width than provided in the settings. " +"This setting controls the speed changes for such lines." +msgstr "" +"Wydrukuj cieńsze niż normalne linie szybciej, tak aby ilość materiału " +"wytłaczanego na sekundę pozostała taka sama. Cienkie części modelu mogą " +"wymagać drukowania linii o mniejszej szerokości linii niż podane w " +"ustawieniach. To ustawienie kontroluje zmiany prędkości dla takich linii." + +msgctxt "speed_equalize_flow_enabled label" +msgid "Equalize Filament Flow" +msgstr "Równowaga przepływu dyszy" + +msgctxt "speed_equalize_flow_max description" +msgid "" +"Maximum print speed when adjusting the print speed in order to equalize flow." +msgstr "" +"Maksymalna prędkość drukowania podczas ustawiania prędkości druku w celu " +"wyrównywania przepływu." + +msgctxt "speed_equalize_flow_max label" +msgid "Maximum Speed for Flow Equalization" +msgstr "Maksymalna prędkość dla wyrównania przepływu" + +msgctxt "speed_infill description" +msgid "The speed at which infill is printed." +msgstr "Szybkość, przy której wypełnienie jest drukowane." + +msgctxt "speed_infill label" +msgid "Infill Speed" +msgstr "Prędkość wypełnienia" + +msgctxt "speed_layer_0 description" +msgid "" +"The speed for the initial layer. A lower value is advised to improve " +"adhesion to the build plate." +msgstr "" +"Prędkość dla pierwszej warstwy. Niższa wartość jest zalecane w celu poprawy " +"przyczepności do płyty drukarskiej." + +msgctxt "speed_layer_0 label" +msgid "Initial Layer Speed" +msgstr "Szybkość pierwszej warstwy" + +msgctxt "speed_prime_tower description" +msgid "" +"The speed at which the prime tower is printed. Printing the prime tower " +"slower can make it more stable when the adhesion between the different " +"filaments is suboptimal." +msgstr "" +"Prędkość, z jaką drukowana jest pierwszorzędna wieża. Drukowanie głowicy " +"głównej wolniej może sprawić, że będzie ona bardziej stabilna, gdy adhezja " +"między różnymi włóknami jest nieopłacalna." + +msgctxt "speed_prime_tower label" +msgid "Prime Tower Speed" +msgstr "Prędkość, z jaką drukowana jest pierwszorzędna wieża." + +msgctxt "speed_print description" +msgid "The speed at which printing happens." +msgstr "Prędkość druku." + +msgctxt "speed_print label" +msgid "Print Speed" +msgstr "Prędkość drukowania" + +msgctxt "speed_print_layer_0 description" +msgid "" +"The speed of printing for the initial layer. A lower value is advised to " +"improve adhesion to the build plate." +msgstr "" +"Szybkość drukowania dla pierwszej warstwy. Niższa wartość jest zalecane w " +"celu poprawy przyczepności do płyty drukarskiej." + +msgctxt "speed_print_layer_0 label" +msgid "Initial Layer Print Speed" +msgstr "Szybkość drukowania do pierwszej warstwy" + +msgctxt "speed_slowdown_layers description" +msgid "" +"The first few layers are printed slower than the rest of the model, to get " +"better adhesion to the build plate and improve the overall success rate of " +"prints. The speed is gradually increased over these layers." +msgstr "" +"Pierwsze warstwy są drukowane wolniej niż w pozostałej części modelu, więc " +"lepiej przylegają do łóżka druku i zwiększyć prawdopodobieństwo pomyślnego " +"ciśnieniem. Prędkość wzrasta stopniowo w czasie produkcji tych warstw." + +msgctxt "speed_slowdown_layers label" +msgid "Number of Slower Layers" +msgstr "Ilość wolnych warstw" + +msgctxt "speed_support description" +msgid "" +"The speed at which the support structure is printed. Printing support at " +"higher speeds can greatly reduce printing time. The surface quality of the " +"support structure is not important since it is removed after printing." +msgstr "" +"Szybkość, z jaką struktura nośna jest drukowana. Drukując konstrukcję " +"podporową przy wyższych prędkościach, całkowity czas drukowania może być " +"znacznie zmniejszona. Jakość powierzchni konstrukcji nośnej nie ma " +"znaczenia, ponieważ jest on usuwany po drukowaniu." + +msgctxt "speed_support label" +msgid "Support Speed" +msgstr "Prędkość podpór." + +msgctxt "speed_support_bottom description" +msgid "" +"The speed at which the floor of support is printed. Printing it at lower " +"speed can improve adhesion of support on top of your model." +msgstr "" +"Prędkość, z jaką drukowana jest podpórka. Drukowanie z niższą prędkością " +"może poprawić przyczepność podpory nad modelem." + +msgctxt "speed_support_bottom label" +msgid "Support Floor Speed" +msgstr "Prędkosć drukowanych podpór dolnych/podłogi" + +msgctxt "speed_support_infill description" +msgid "" +"The speed at which the infill of support is printed. Printing the infill at " +"lower speeds improves stability." +msgstr "" +"Prędkość, z jaką drukowany jest wypełnienie podłoża. Drukowanie wypełnień " +"przy niższych prędkościach poprawia stabilność." + +msgctxt "speed_support_infill label" +msgid "Support Infill Speed" +msgstr "Prędkość wypełnienia podpór" + +msgctxt "speed_support_interface description" +msgid "" +"The speed at which the roofs and floors of support are printed. Printing " +"them at lower speeds can improve overhang quality." +msgstr "" +"Szybkość, z jaką dachy i podłogi konstrukcji nośnej mają zostać wydrukowane. " +"Drukując z mniejszą prędkością, jakość nawisy można poprawić." + +msgctxt "speed_support_interface label" +msgid "Support Interface Speed" +msgstr "Prędkość interfejsu wsparcia" + +msgctxt "speed_support_roof description" +msgid "" +"The speed at which the roofs of support are printed. Printing them at lower " +"speeds can improve overhang quality." +msgstr "" +"Prędkość, w jakiej są drukowane nad dachami podparcia. Drukowanie przy " +"niższych prędkościach może poprawić jakość zwisu." + +msgctxt "speed_support_roof label" +msgid "Support Roof Speed" +msgstr "Prędkość drukowanych podpór zwisów/dachu" + +msgctxt "speed_topbottom description" +msgid "The speed at which top/bottom layers are printed." +msgstr "Szybkość, przy której górne / dolne warstwy druku są drukowane." + +msgctxt "speed_topbottom label" +msgid "Top/Bottom Speed" +msgstr "Prędkość górnej / dolnej warstwy" + +msgctxt "speed_travel description" +msgid "The speed at which travel moves are made." +msgstr "Prędkość, w jakiej wykonywane są przemieszczenia." + +msgctxt "speed_travel label" +msgid "Travel Speed" +msgstr "Szybkość przemieszczania." + +msgctxt "speed_travel_layer_0 description" +msgid "" +"The speed of travel moves in the initial layer. A lower value is advised to " +"prevent pulling previously printed parts away from the build plate. The " +"value of this setting can automatically be calculated from the ratio between " +"the Travel Speed and the Print Speed." +msgstr "" +"Prędkość przesuwa się w początkowej warstwie. Zaleca się niższą wartość, aby " +"zapobiec ciągnięciu wcześniej wydrukowanych części z płyty montażowej. " +"Wartość tego ustawienia może być automatycznie obliczana na podstawie " +"stosunku prędkości podróży i prędkości druku." + +msgctxt "speed_travel_layer_0 label" +msgid "Initial Layer Travel Speed" +msgstr "Prędkość ruchu dla pierwszej warstwy" + +msgctxt "speed_wall description" +msgid "The speed at which the walls are printed." +msgstr "Prędkość drukowania ścian." + +msgctxt "speed_wall label" +msgid "Wall Speed" +msgstr "Szybkość ściany" + +msgctxt "speed_wall_0 description" +msgid "" +"The speed at which the outermost walls are printed. Printing the outer wall " +"at a lower speed improves the final skin quality. However, having a large " +"difference between the inner wall speed and the outer wall speed will affect " +"quality in a negative way." +msgstr "" +"Szybkość, przy której ścianki zewnętrzne są drukowane. Drukując zewnętrzną " +"ściankę w niższej prędkości, lepsza jakośś końcowa powłoki zewnętrznej jest " +"osiągnięta. Jednakże, jeśli nie ma między prędkością ściany wewnętrznej i " +"ściany zewnętrznej, że dla zbyt wielkiej różnicy, jakość jest niekorzystna." + +msgctxt "speed_wall_0 label" +msgid "Outer Wall Speed" +msgstr "Zewnętrzna ściana prędkość" + +msgctxt "speed_wall_x description" +msgid "" +"The speed at which all inner walls are printed. Printing the inner wall " +"faster than the outer wall will reduce printing time. It works well to set " +"this in between the outer wall speed and the infill speed." +msgstr "" +"Szybkość, przy której wszystkie ściany wewnętrzne są drukowane. Gdy ścianka " +"wewnętrzna jest większa od zewnętrznej ściany drukowanej czas drukowania " +"zmniejsza się. Zaleca się, aby to prędkości między prędkością ścianki " +"zewnętrznej i prędkości wypełnienia." + +msgctxt "speed_wall_x label" +msgid "Inner Wall Speed" +msgstr "Prędkość wewnętrznej ściany" + +msgctxt "start_layers_at_same_position description" +msgid "" +"In each layer start with printing the object near the same point, so that we " +"don't start a new layer with printing the piece which the previous layer " +"ended with. This makes for better overhangs and small parts, but increases " +"printing time." +msgstr "" +"W każdej warstwie zaczynają się drukowanie przedmiotu w tym samym punkcie, " +"abyśmy nie zaczęli nowej warstwy z nadrukiem kawałka, który poprzednia " +"warstwa się skończyła. Powoduje to lepsze zwisanie i małe części, ale " +"zwiększa czas drukowania." + +msgctxt "start_layers_at_same_position label" +msgid "Start Layers with the Same Part" +msgstr "Uruchamianie warstw o tej samej części" + +msgctxt "sub_div_rad_add description" +msgid "" +"An addition to the radius from the center of each cube to check for the " +"boundary of the model, as to decide whether this cube should be subdivided. " +"Larger values lead to a thicker shell of small cubes near the boundary of " +"the model." +msgstr "" +"Dodano do promienia od środka każdej kostki, aby sprawdzić granicę modelu, " +"aby podjąć decyzję, czy taka kostka powinna być podzielona. Większe wartości " +"prowadzą do grubszej powłoki małych kostek w pobliżu granicy modelu." + +msgctxt "sub_div_rad_add label" +msgid "Cubic Subdivision Shell" +msgstr "Sześcian" + +msgctxt "support description" +msgid "Support" +msgstr "Konstrukcja nośna/Podpora" + +msgctxt "support label" +msgid "Support" +msgstr "Konstrukcja nośna/Podpora" + +msgctxt "support_angle description" +msgid "" +"The minimum angle of overhangs for which support is added. At a value of 0° " +"all overhangs are supported, 90° will not provide any support." +msgstr "" +"Minimalny kąt zwisu, dla którego dodano podporę. Przy wartości 0 ° wszystkie " +"wsporniki są podparte, 90 ° nie zapewnia żadnego podparcia." + +msgctxt "support_angle label" +msgid "Support Overhang Angle" +msgstr "Kąt dla konstrukcji nośnej zwisy" + +msgctxt "support_bottom_density description" +msgid "" +"The density of the floors of the support structure. A higher value results " +"in better adhesion of the support on top of the model." +msgstr "" +"Gęstość podłóg konstrukcji nośnej. Wyższa wartość powoduje lepszą adhezję " +"podpory nad modelem." + +msgctxt "support_bottom_density label" +msgid "Support Floor Density" +msgstr "Gęstość podłogi nośnej" + +msgctxt "support_bottom_distance description" +msgid "Distance from the print to the bottom of the support." +msgstr "Odległość od nadruku do dolnej części wspornika." + +msgctxt "support_bottom_distance label" +msgid "Support Bottom Distance" +msgstr "Dolny rozstaw konstrukcji nośnej" + +msgctxt "support_bottom_enable description" +msgid "" +"Generate a dense slab of material between the bottom of the support and the " +"model. This will create a skin between the model and support." +msgstr "" +"Generuje gęstą warstwę materiału pomiędzy spodem konstrukcji nośnej i " +"modelu. To tworzy skórę pomiędzy modelem a konstrukcją nośną." + +msgctxt "support_bottom_enable label" +msgid "Enable Support Floor" +msgstr "Włącz podstawę nośną" + +msgctxt "support_bottom_extruder_nr description" +msgid "" +"The extruder train to use for printing the floors of the support. This is " +"used in multi-extrusion." +msgstr "" +"Element wytłaczarki do drukowania na konstrukcji nośnej na podłożu. Służy do " +"multi-ekstruzji." + +msgctxt "support_bottom_extruder_nr label" +msgid "Support Floor Extruder" +msgstr "Wytłaczarka do struktury podłoża" + +msgctxt "support_bottom_height description" +msgid "" +"The thickness of the support floors. This controls the number of dense " +"layers that are printed on top of places of a model on which support rests." +msgstr "" +"Grubość płyt nośnych. Steruje liczbę zwartych warstw, które są drukowane z " +"modelem, w którym konstrukcja nośna spoczywa." + +msgctxt "support_bottom_height label" +msgid "Support Floor Thickness" +msgstr "Grubość struktury podłogi" + +msgctxt "support_bottom_line_distance description" +msgid "" +"Distance between the printed support floor lines. This setting is calculated " +"by the Support Floor Density, but can be adjusted separately." +msgstr "" +"Odległość między drukowanymi liniami podłogowymi podparcia. To ustawienie " +"jest obliczane za pomocą Gęstości podłogi podpór, ale można je wyregulować " +"oddzielnie." + +msgctxt "support_bottom_line_distance label" +msgid "Support Floor Line Distance" +msgstr "Odstęp linii struktury podłoża" + +msgctxt "support_bottom_line_width description" +msgid "Width of a single support floor line." +msgstr "Szerokość pojedynczej podpory." + +msgctxt "support_bottom_line_width label" +msgid "Support Floor Line Width" +msgstr "Konstrukcja nośna szerokość dolna linia" + +msgctxt "support_bottom_pattern description" +msgid "The pattern with which the floors of the support are printed." +msgstr "Wzorzec, z którym drukowane są podłoża." + +msgctxt "support_bottom_pattern label" +msgid "Support Floor Pattern" +msgstr "Wzorzec Podłogi Wsparcia" + +msgctxt "support_bottom_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +msgctxt "support_bottom_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Koncentryczny 3D" + +msgctxt "support_bottom_pattern option grid" +msgid "Grid" +msgstr "Kratka" + +msgctxt "support_bottom_pattern option lines" +msgid "Lines" +msgstr "Liniowy" + +msgctxt "support_bottom_pattern option triangles" +msgid "Triangles" +msgstr "Trójkąty" + +msgctxt "support_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "support_bottom_stair_step_height description" +msgid "" +"The height of the steps of the stair-like bottom of support resting on the " +"model. A low value makes the support harder to remove, but too high values " +"can lead to unstable support structures. Set to zero to turn off the stair-" +"like behaviour." +msgstr "" +"Wysokość schodów schody podstawy w kształcie struktury nośnej modelu. Niska " +"wartość może usunięcie konstrukcji nośnej, ale zbyt duża wartość może " +"prowadzić do niestabilnej konstrukcji wsporczych. Ustawiony na zero, aby " +"wyłączyć odpowiedzi skokowej." + +msgctxt "support_bottom_stair_step_height label" +msgid "Support Stair Step Height" +msgstr "Wysokość stopnia konstrukcji wsporczej" + +msgctxt "support_bottom_stair_step_width description" +msgid "" +"The maximum width of the steps of the stair-like bottom of support resting " +"on the model. A low value makes the support harder to remove, but too high " +"values can lead to unstable support structures." +msgstr "" +"Maksymalna szerokość stopni stopnia schodowego podpory oparta na modelu. " +"Niska wartość sprawia, że wsparcie jest trudniejsze do usunięcia, ale zbyt " +"wysokie wartości mogą prowadzić do niestabilnych struktur podparcia." + +msgctxt "support_bottom_stair_step_width label" +msgid "Support Stair Step Maximum Width" +msgstr "Maks. Wysokość stopnia od konstrukcji wsporczej" + +msgctxt "support_conical_angle description" +msgid "" +"The angle of the tilt of conical support. With 0 degrees being vertical, and " +"90 degrees being horizontal. Smaller angles cause the support to be more " +"sturdy, but consist of more material. Negative angles cause the base of the " +"support to be wider than the top." +msgstr "" +"Kąt nachylenia stożkowego podparcia. Przy 0 stopniach jest pionowa i 90 " +"stopni w poziomie. Mniejsze kąty sprawiają, że podparcie jest bardziej " +"wytrzymałe, ale składa się z większej ilości materiału. Kąty ujemne " +"powodują, że podstawa wspornika jest szersza niż górna." + +msgctxt "support_conical_angle label" +msgid "Conical Support Angle" +msgstr "Kąt stożkowy konstrukcji wsporczej" + +msgctxt "support_conical_enabled description" +msgid "" +"Experimental feature: Make support areas smaller at the bottom than at the " +"overhang." +msgstr "" +"Eksperymentalna cecha: W dolnym obszarze podpory powinny być mniejsze niż na " +"zwisie." + +msgctxt "support_conical_enabled label" +msgid "Enable Conical Support" +msgstr "Włącz wsparcie stożkowe" + +msgctxt "support_conical_min_width description" +msgid "" +"Minimum width to which the base of the conical support area is reduced. " +"Small widths can lead to unstable support structures." +msgstr "" +"Minimalna szerokość, na którą jest zmniejszona podstawa stożkowego " +"podparcia. Małe szerokości mogą prowadzić do niestabilnych struktur nośnych" + +msgctxt "support_conical_min_width label" +msgid "Conical Support Minimum Width" +msgstr "Wspornik stożkowy Minimalna szerokość" + +msgctxt "support_connect_zigzags description" +msgid "" +"Connect the ZigZags. This will increase the strength of the zig zag support " +"structure." +msgstr "" +"Elementy zygzaka są połączone. To zwiększa wytrzymałość zygzakowatej " +"konstrukcji nośnej." + +msgctxt "support_connect_zigzags label" +msgid "Connect Support ZigZags" +msgstr "Zygzakowate łączenia elementów wspierających konstrukcję" + +msgctxt "support_enable description" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "" +"Generowanie struktur wspierających części modelu, które mają zwis. Bez tych " +"struktur takie części mogłyby spaść podczas drukowania." + +msgctxt "support_enable label" +msgid "Generate Support" +msgstr "Wygeneruj podpory" + +msgctxt "support_extruder_nr description" +msgid "" +"The extruder train to use for printing the support. This is used in multi-" +"extrusion." +msgstr "" +"Element wytłaczarki do drukowania na konstrukcji nośnej. Służy do multi-" +"ekstruzji." + +msgctxt "support_extruder_nr label" +msgid "Support Extruder" +msgstr "Konstrukcja nośna wytłaczarki" + +msgctxt "support_extruder_nr_layer_0 description" +msgid "" +"The extruder train to use for printing the first layer of support infill. " +"This is used in multi-extrusion." +msgstr "" +"Wytłaczarka wykorzystuje do drukowania pierwszej warstwy wypełnienia " +"podłoża. Jest on stosowany w wielu wytłaczaniach." + +msgctxt "support_extruder_nr_layer_0 label" +msgid "First Layer Support Extruder" +msgstr "Pierwsza warstwa wspierająca wytłaczarkę" + +msgctxt "support_infill_extruder_nr description" +msgid "" +"The extruder train to use for printing the infill of the support. This is " +"used in multi-extrusion." +msgstr "" +"Element wytłaczarki do drukowania napełnianie konstrukcji nośnej. Służy do " +"multi-ekstruzji." + +msgctxt "support_infill_extruder_nr label" +msgid "Support Infill Extruder" +msgstr "Wytłaczarka do wypełniania strukturę nośną" + +msgctxt "support_infill_rate description" +msgid "" +"Adjusts the density of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "" +"Reguluje gęstość konstrukcji wsporczej. Wyższa wartość powoduje lepsze " +"zwisy, ale podpory są trudniejsze do usunięcia." + +msgctxt "support_infill_rate label" +msgid "Support Density" +msgstr "Gęstość konstrukcji nośnej" + +msgctxt "support_interface_density description" +msgid "" +"Adjusts the density of the roofs and floors of the support structure. A " +"higher value results in better overhangs, but the supports are harder to " +"remove." +msgstr "" +"Dostosowuje gęstość dachów i podłóg konstrukcji nośnej. Wyższa wartość " +"powoduje lepsze zwisy, ale podpory są trudniejsze do usunięcia." + +msgctxt "support_interface_density label" +msgid "Support Interface Density" +msgstr "Gęstość interfejsu pomocniczego" + +msgctxt "support_interface_enable description" +msgid "" +"Generate a dense interface between the model and the support. This will " +"create a skin at the top of the support on which the model is printed and at " +"the bottom of the support, where it rests on the model." +msgstr "" +"Generuje szczelne połączenie pomiędzy modelem i konstrukcją nośną. To tworzy " +"skóry na górnej części konstrukcji nośnej, na której model jest drukowany i " +"spód konstrukcji nośnej, gdzie opiera się na modelu." + +msgctxt "support_interface_enable label" +msgid "Enable Support Interface" +msgstr "Włącz interfejs wsparcia" + +msgctxt "support_interface_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs and floors of the support. " +"This is used in multi-extrusion." +msgstr "" +"Element wytłaczarki do drukowania na dachy i podłogi konstrukcji nośnej. " +"Służy do multi-ekstruzji." + +msgctxt "support_interface_extruder_nr label" +msgid "Support Interface Extruder" +msgstr "Wytłaczarka interfejsu wspomagającego" + +msgctxt "support_interface_height description" +msgid "" +"The thickness of the interface of the support where it touches with the " +"model on the bottom or the top." +msgstr "" +"Grubość styku konstrukcji nośnej, gdzie styka się ona Model powyżej i " +"poniżej." + +msgctxt "support_interface_height label" +msgid "Support Interface Thickness" +msgstr "Grubość interfejsu konstrukcja wsporcza" + +msgctxt "support_interface_line_width description" +msgid "Width of a single line of support roof or floor." +msgstr "Szerokość pojedynczej linii podparcia dachu lub podłogi." + +msgctxt "support_interface_line_width label" +msgid "Support Interface Line Width" +msgstr "Szerokość linii interfejsu podpór" + +msgctxt "support_interface_pattern description" +msgid "" +"The pattern with which the interface of the support with the model is " +"printed." +msgstr "Wzorzec, z którym drukowany jest interfejs nośnika z modelem." + +msgctxt "support_interface_pattern label" +msgid "Support Interface Pattern" +msgstr "Wzór interfejs konstrukcja nośna" + +msgctxt "support_interface_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +msgctxt "support_interface_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Koncentryczny 3D" + +msgctxt "support_interface_pattern option grid" +msgid "Grid" +msgstr "Kratka" + +msgctxt "support_interface_pattern option lines" +msgid "Lines" +msgstr "Liniowy" + +msgctxt "support_interface_pattern option triangles" +msgid "Triangles" +msgstr "Trójkąty" + +msgctxt "support_interface_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "support_interface_skip_height description" +msgid "" +"When checking where there's model above and below the support, take steps of " +"the given height. Lower values will slice slower, while higher values may " +"cause normal support to be printed in some places where there should have " +"been support interface." +msgstr "" +"Sprawdzając, gdzie znajduje się model powyżej i poniżej wspornika, wykonaj " +"kroki na danej wysokości. Niższe wartości będą łamywać wolniej, podczas gdy " +"wyższe wartości mogą powodować drukowanie zwykłego nośnika w niektórych " +"miejscach, w których powinien istnieć interfejs obsługi." + +msgctxt "support_interface_skip_height label" +msgid "Support Interface Resolution" +msgstr "Rozdzielczość interfejs konstrukcja nośna" + +msgctxt "support_join_distance description" +msgid "" +"The maximum distance between support structures in the X/Y directions. When " +"seperate structures are closer together than this value, the structures " +"merge into one." +msgstr "" +"Maksymalna odległość między konstrukcjami nośnymi w kierunkach X / Y. Gdy " +"oddzielne struktury są bliżej siebie niż ta wartość, struktury łączą się w " +"jedną." + +msgctxt "support_join_distance label" +msgid "Support Join Distance" +msgstr "Odległość do łączenia struktur wsparcia" + +msgctxt "support_line_distance description" +msgid "" +"Distance between the printed support structure lines. This setting is " +"calculated by the support density." +msgstr "" +"Odległość między drukowanymi liniami nośnymi. To ustawienie jest obliczane " +"przez gęstość nośną." + +msgctxt "support_line_distance label" +msgid "Support Line Distance" +msgstr "Odstępy między wierszami konstrukcji nośnej" + +msgctxt "support_line_width description" +msgid "Width of a single support structure line." +msgstr "Szerokość jednej linii konstrukcji nośnej." + +msgctxt "support_line_width label" +msgid "Support Line Width" +msgstr "Szerokość linii podpór" + +msgctxt "support_mesh description" +msgid "" +"Use this mesh to specify support areas. This can be used to generate support " +"structure." +msgstr "" +"Użyj tej siatki, aby określić obszary wsparcia. Można to wykorzystać do " +"generowania struktury nośnej." + +msgctxt "support_mesh label" +msgid "Support Mesh" +msgstr "Wsparcie siatki" + +msgctxt "support_mesh_drop_down description" +msgid "" +"Make support everywhere below the support mesh, so that there's no overhang " +"in the support mesh." +msgstr "" +"Wspieraj wszędzie pod siatką podpory, tak aby nie było zwisu w siatce " +"podpory." + +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Siatka wsparcia Drop Down" + +msgctxt "support_minimal_diameter description" +msgid "" +"Minimum diameter in the X/Y directions of a small area which is to be " +"supported by a specialized support tower." +msgstr "" +"Minimalna średnica w X / Y kierunkach o małej powierzchni, który jest " +"obsługiwany przez specjalne podpory nośne." + +msgctxt "support_minimal_diameter label" +msgid "Minimum Diameter" +msgstr "Minimalna średnica" + +msgctxt "support_offset description" +msgid "" +"Amount of offset applied to all support polygons in each layer. Positive " +"values can smooth out the support areas and result in more sturdy support." +msgstr "" +"Odstęp, który jest stosowany do wielokątów w poszczególnych warstwach. " +"Wartości dodatnie mogą wygładzić elementy nośne, a tym samym zapewnić " +"bardziej stabilną konstrukcję nośną." + +msgctxt "support_offset label" +msgid "Support Horizontal Expansion" +msgstr "Ekspansja pozioma konstrukcji nośnej" + +msgctxt "support_pattern description" +msgid "" +"The pattern of the support structures of the print. The different options " +"available result in sturdy or easy to remove support." +msgstr "" +"Wzór struktury nośnej druku. Różne opcje zapewniają trwałe lub łatwe do " +"demontażu podparcie." + +msgctxt "support_pattern label" +msgid "Support Pattern" +msgstr "Wzorzec wsparcia/podpory" + +msgctxt "support_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +msgctxt "support_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Koncentryczny 3D" + +msgctxt "support_pattern option grid" +msgid "Grid" +msgstr "Kratka" + +msgctxt "support_pattern option lines" +msgid "Lines" +msgstr "Liniowy" + +msgctxt "support_pattern option triangles" +msgid "Triangles" +msgstr "Trójkąty" + +msgctxt "support_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "support_roof_density description" +msgid "" +"The density of the roofs of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "" +"Gęstość dachów konstrukcji nośnej. Wyższa wartość powoduje lepsze zwisy, ale " +"podpory są trudniejsze do usunięcia." + +msgctxt "support_roof_density label" +msgid "Support Roof Density" +msgstr "Wspieraj gęstość dachu" + +msgctxt "support_roof_enable description" +msgid "" +"Generate a dense slab of material between the top of support and the model. " +"This will create a skin between the model and support." +msgstr "" +"Wytworzyć gęstą płytę materiału pomiędzy wierzchołkiem podparcia a modelem. " +"Powoduje to powstanie skóry między modelem a wsparciem." + +msgctxt "support_roof_enable label" +msgid "Enable Support Roof" +msgstr "Włącz podpory nośne dachu/zwisu" + +msgctxt "support_roof_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs of the support. This is " +"used in multi-extrusion." +msgstr "" +"Element wytłaczarki do drukowania na konstrukcji wsporczej dachu. Służy do " +"multi-ekstruzji." + +msgctxt "support_roof_extruder_nr label" +msgid "Support Roof Extruder" +msgstr "Wspomaganie ekstruzji dachowej" + +msgctxt "support_roof_height description" +msgid "" +"The thickness of the support roofs. This controls the amount of dense layers " +"at the top of the support on which the model rests." +msgstr "" +"Grubość dachu nośnej. Steruje ilość gęstej warstwy na górnej części " +"konstrukcji nośnej, w którym model jest w pozycji siedzącej." + +msgctxt "support_roof_height label" +msgid "Support Roof Thickness" +msgstr "Grubość warstwy nośnej dachu/zwisu" + +msgctxt "support_roof_line_distance description" +msgid "" +"Distance between the printed support roof lines. This setting is calculated " +"by the Support Roof Density, but can be adjusted separately." +msgstr "" +"Odległość pomiędzy drukowanych linii nośnych dachu. Regulacja ta jest " +"obliczona na podstawie gęstości struktury nośnej, ale może być także " +"ustawiony oddzielnie." + +msgctxt "support_roof_line_distance label" +msgid "Support Roof Line Distance" +msgstr "Wsparcie dla linii dachowej" + +msgctxt "support_roof_line_width description" +msgid "Width of a single support roof line." +msgstr "Szerokość pojedynczej podpory dachowej." + +msgctxt "support_roof_line_width label" +msgid "Support Roof Line Width" +msgstr "Podpory szerokości linii dachu" + +msgctxt "support_roof_pattern description" +msgid "The pattern with which the roofs of the support are printed." +msgstr "Wzór, na którym są drukowane nad dachami podpory." + +msgctxt "support_roof_pattern label" +msgid "Support Roof Pattern" +msgstr "Wsparcie Wzoru Dachu" + +msgctxt "support_roof_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +msgctxt "support_roof_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Koncentryczny 3D" + +msgctxt "support_roof_pattern option grid" +msgid "Grid" +msgstr "Kratka" + +msgctxt "support_roof_pattern option lines" +msgid "Lines" +msgstr "Liniowy" + +msgctxt "support_roof_pattern option triangles" +msgid "Triangles" +msgstr "Trójkąty" + +msgctxt "support_roof_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "support_top_distance description" +msgid "Distance from the top of the support to the print." +msgstr "Odległość od wierzchołka podpory do nadruku." + +msgctxt "support_top_distance label" +msgid "Support Top Distance" +msgstr "Górny rozstaw struktury wsparcia" + +msgctxt "support_tower_diameter description" +msgid "The diameter of a special tower." +msgstr "Średnica specjalnych filarów." + +msgctxt "support_tower_diameter label" +msgid "Tower Diameter" +msgstr "Średnica filarów" + +msgctxt "support_tower_roof_angle description" +msgid "" +"The angle of a rooftop of a tower. A higher value results in pointed tower " +"roofs, a lower value results in flattened tower roofs." +msgstr "" +"Kąt dachu filar. Wyższa wartość wskazał dachy filar spowodować, niższą " +"wartość spowoduje płytszych dachów filaru." + +msgctxt "support_tower_roof_angle label" +msgid "Tower Roof Angle" +msgstr "Kąt filarów dachowych" + +msgctxt "support_type description" +msgid "" +"Adjusts the placement of the support structures. The placement can be set to " +"touching build plate or everywhere. When set to everywhere the support " +"structures will also be printed on the model." +msgstr "" +"Reguluje rozmieszczenie struktur nośnych. Umiejscowienie można ustawić tak, " +"aby dotykać płyty budowlanej lub wszędzie. Po ustawieniu na wszędzie " +"struktury wydruku będą również drukowane na modelu." + +msgctxt "support_type label" +msgid "Support Placement" +msgstr "Miejsce wsparcia" + +msgctxt "support_type option buildplate" +msgid "Touching Buildplate" +msgstr "Dotykając stołu" + +msgctxt "support_type option everywhere" +msgid "Everywhere" +msgstr "Wszędzie" + +msgctxt "support_use_towers description" +msgid "" +"Use specialized towers to support tiny overhang areas. These towers have a " +"larger diameter than the region they support. Near the overhang the towers' " +"diameter decreases, forming a roof." +msgstr "" +"Stosowane specjalne słupy wspierajace małe zwisy. Te filary mają średnicę " +"większą niż obsługiwanym z nich obszaru. W pobliżu występu, średnica kolumn, " +"w wyniku powstawania dachu zmniejszyć." + +msgctxt "support_use_towers label" +msgid "Use Towers" +msgstr "Korzystanie z filarów" + +msgctxt "support_xy_distance description" +msgid "Distance of the support structure from the print in the X/Y directions." +msgstr "Odległość konstrukcji nośnej od nadruku w kierunkach X / Y." + +msgctxt "support_xy_distance label" +msgid "Support X/Y Distance" +msgstr "X / Y odległości od konstrukcji wsporczej" + +msgctxt "support_xy_distance_overhang description" +msgid "" +"Distance of the support structure from the overhang in the X/Y directions. " +msgstr "Odległość konstrukcji nośnej od zwisu w kierunkach X / Y." + +msgctxt "support_xy_distance_overhang label" +msgid "Minimum Support X/Y Distance" +msgstr "Minimalna odległość X / Y wsparcia" + +msgctxt "support_xy_overrides_z description" +msgid "" +"Whether the Support X/Y Distance overrides the Support Z Distance or vice " +"versa. When X/Y overrides Z the X/Y distance can push away the support from " +"the model, influencing the actual Z distance to the overhang. We can disable " +"this by not applying the X/Y distance around overhangs." +msgstr "" +"Niezależnie od tego, czy odległość X / Y wspornika zastępuje dystans Złącza " +"Wsparcia lub odwrotnie. Kiedy X / Y zignoruje Z, odległość X / Y może " +"odepchnąć podparcie od modelu, wpływając na rzeczywistą odległość Z do " +"zwisu. Możemy to wyłączyć, nie stosując odległości X / Y wokół zwisów." + +msgctxt "support_xy_overrides_z label" +msgid "Support Distance Priority" +msgstr "Priorytet dystansu wsparcia" + +msgctxt "support_xy_overrides_z option xy_overrides_z" +msgid "X/Y overrides Z" +msgstr "X / Y zastępuje Z" + +msgctxt "support_xy_overrides_z option z_overrides_xy" +msgid "Z overrides X/Y" +msgstr "Z zastępuje X / Y" + +msgctxt "support_z_distance description" +msgid "" +"Distance from the top/bottom of the support structure to the print. This gap " +"provides clearance to remove the supports after the model is printed. This " +"value is rounded up to a multiple of the layer height." +msgstr "" +"Odległość od góry / dołu struktury nośnej do nadruku. Ta luka zapewnia luz, " +"aby usunąć wsporniki po wydrukowaniu modelu. Ta wartość jest zaokrąglana do " +"wielokrotności wysokości warstwy." + +msgctxt "support_z_distance label" +msgid "Support Z Distance" +msgstr "Odległości osi Z od konstrukcji wsporczej" + +msgctxt "switch_extruder_prime_speed description" +msgid "" +"The speed at which the filament is pushed back after a nozzle switch " +"retraction." +msgstr "" +"Prędkość, w której włókno jest odepchniente po wycofaniu przełącznika dyszy." + +msgctxt "switch_extruder_prime_speed label" +msgid "Nozzle Switch Prime Speed" +msgstr "Szybkość podawania przełącznik dyszy (wciągania)" + +msgctxt "switch_extruder_retraction_amount description" +msgid "" +"The amount of retraction: Set at 0 for no retraction at all. This should " +"generally be the same as the length of the heat zone." +msgstr "" +"Ilość wycofania: Ustaw na 0, aby nie wycofać się. To powinno generalnie być " +"takie samo jak długość strefy grzewczej." + +msgctxt "switch_extruder_retraction_amount label" +msgid "Nozzle Switch Retraction Distance" +msgstr "Odległość odsunięcia przełącznika dyszy" + +msgctxt "switch_extruder_retraction_speed description" +msgid "" +"The speed at which the filament is retracted during a nozzle switch retract." +msgstr "" +"Prędkość, z jaką włókna są wycofywane podczas wysuwu przełącznika dyszy." + +msgctxt "switch_extruder_retraction_speed label" +msgid "Nozzle Switch Retract Speed" +msgstr "Szybkość wycofywania przełącznika dyszy" + +msgctxt "switch_extruder_retraction_speeds description" +msgid "" +"The speed at which the filament is retracted. A higher retraction speed " +"works better, but a very high retraction speed can lead to filament grinding." +msgstr "" +"Prędkość, z jaką włókna są wycofywane. Wyższa szybkość wysuwania działa " +"lepiej, ale bardzo duża szybkość wycofywania może prowadzić do złych efektów." + +msgctxt "switch_extruder_retraction_speeds label" +msgid "Nozzle Switch Retraction Speed" +msgstr "Prędkość wycofania przełącznika dyszy" + +msgctxt "top_bottom_pattern description" +msgid "The pattern of the top/bottom layers." +msgstr "Wzór górnej / dolnej warstwy." + +msgctxt "top_bottom_pattern label" +msgid "Top/Bottom Pattern" +msgstr "Dolny/Górny Wzór" + +msgctxt "top_bottom_pattern option concentric" +msgid "Concentric" +msgstr "koncentryczny" + +msgctxt "top_bottom_pattern option lines" +msgid "Lines" +msgstr "liniowy" + +msgctxt "top_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "top_bottom_pattern_0 description" +msgid "The pattern on the bottom of the print on the first layer." +msgstr "Wzorzec na dole wydruku na pierwszej warstwie." + +msgctxt "top_bottom_pattern_0 label" +msgid "Bottom Pattern Initial Layer" +msgstr "Dolna warstwa początkowa " + +msgctxt "top_bottom_pattern_0 option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +msgctxt "top_bottom_pattern_0 option lines" +msgid "Lines" +msgstr "Liniowy" + +msgctxt "top_bottom_pattern_0 option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +msgctxt "top_bottom_thickness description" +msgid "" +"The thickness of the top/bottom layers in the print. This value divided by " +"the layer height defines the number of top/bottom layers." +msgstr "" +"Grubość górnej / dolnej warstwy druku. Ta wartość podzielona przez wysokość " +"warstwy definiuje liczbę warstw wierzchnich / dolnych." + +msgctxt "top_bottom_thickness label" +msgid "Top/Bottom Thickness" +msgstr "Grubość górnej i dolnej" + +msgctxt "top_layers description" +msgid "" +"The number of top layers. When calculated by the top thickness, this value " +"is rounded to a whole number." +msgstr "" +"Liczba górnych warstw. Przy obliczaniu górnej grubości wartość ta jest " +"zaokrąglana do liczby całkowitej" + +msgctxt "top_layers label" +msgid "Top Layers" +msgstr "Górne warstwy" + +msgctxt "top_thickness description" +msgid "" +"The thickness of the top layers in the print. This value divided by the " +"layer height defines the number of top layers." +msgstr "" +"Grubość górnych warstw w druku. Ta wartość podzielona przez wysokość warstwy " +"definiuje liczbę warstw górnych." + +msgctxt "top_thickness label" +msgid "Top Thickness" +msgstr "Górna Grubość" + +msgctxt "travel description" +msgid "travel" +msgstr "Ruch" + +msgctxt "travel label" +msgid "Travel" +msgstr "Podróżować" + +msgctxt "travel_avoid_distance description" +msgid "" +"The distance between the nozzle and already printed parts when avoiding " +"during travel moves." +msgstr "" +"Odległość między dyszą a już drukowanych elementów, gdy są one pominięte w " +"ruchu." + +msgctxt "travel_avoid_distance label" +msgid "Travel Avoid Distance" +msgstr "Podróże Unikaj Odległość" + +msgctxt "travel_avoid_other_parts description" +msgid "" +"The nozzle avoids already printed parts when traveling. This option is only " +"available when combing is enabled." +msgstr "" +"Dysza unika już podczas drukowania drukowanych części. Ta opcja jest " +"dostępna tylko w przypadku włączenia uników dyszy." + +msgctxt "travel_avoid_other_parts label" +msgid "Avoid Printed Parts When Traveling" +msgstr "Unikaj drukowanych części podczas podróży" + +msgctxt "travel_compensate_overlapping_walls_0_enabled description" +msgid "" +"Compensate the flow for parts of an outer wall being printed where there is " +"already a wall in place." +msgstr "" +"Kompensuje przepływ części ścian zewnętrznych, które są drukowane, gdy jest " +"już na miejscu." + +msgctxt "travel_compensate_overlapping_walls_0_enabled label" +msgid "Compensate Outer Wall Overlaps" +msgstr "Kompensuj zewnętrzne zakładki ścienne" + +msgctxt "travel_compensate_overlapping_walls_enabled description" +msgid "" +"Compensate the flow for parts of a wall being printed where there is already " +"a wall in place." +msgstr "" +"Kompensuj przepływ części drukowanej ścianki, w której znajduje się już " +"ściana." + +msgctxt "travel_compensate_overlapping_walls_enabled label" +msgid "Compensate Wall Overlaps" +msgstr "Kompensacyjne nakładki na ściany" + +msgctxt "travel_compensate_overlapping_walls_x_enabled description" +msgid "" +"Compensate the flow for parts of an inner wall being printed where there is " +"already a wall in place." +msgstr "" +"Kompensuje przepływ części wewnętrznej ściany drukowanej, gdy jest już na " +"miejscu." + +msgctxt "travel_compensate_overlapping_walls_x_enabled label" +msgid "Compensate Inner Wall Overlaps" +msgstr "Kompensuj wewnętrzne zakładki" + +msgctxt "travel_retract_before_outer_wall description" +msgid "Always retract when moving to start an outer wall." +msgstr "Zawsze cofaj się podczas ruszania, aby rozpocząć zewnętrzną ścianę." + +msgctxt "travel_retract_before_outer_wall label" +msgid "Retract Before Outer Wall" +msgstr "Cofnij przed ścianą zewnętrzną" + +msgctxt "wall_0_inset description" +msgid "" +"Inset applied to the path of the outer wall. If the outer wall is smaller " +"than the nozzle, and printed after the inner walls, use this offset to get " +"the hole in the nozzle to overlap with the inner walls instead of the " +"outside of the model." +msgstr "" +"Wkład nałożony na ścieżkę zewnętrznej ściany. Jeśli zewnętrzna ścianka jest " +"mniejsza niż dysza i nadrukowana po wewnętrznych ściankach, użyj tego " +"przesunięcia, aby uzyskać otwór w dyszy zachodzić na siebie na wewnętrzne " +"ściany zamiast na zewnątrz modelu." + +msgctxt "wall_0_inset label" +msgid "Outer Wall Inset" +msgstr "Zewnętrzna osłona ścienna" + +msgctxt "wall_0_wipe_dist description" +msgid "" +"Distance of a travel move inserted after the outer wall, to hide the Z seam " +"better." +msgstr "Usunięcie ruchu ściany zewnętrznej, w celu ukrycia Z-szew lepiej." + +msgctxt "wall_0_wipe_dist label" +msgid "Outer Wall Wipe Distance" +msgstr "Odległość od ściany zewnętrznej" + +msgctxt "wall_line_count description" +msgid "" +"The number of walls. When calculated by the wall thickness, this value is " +"rounded to a whole number." +msgstr "" +"Liczba ścian. Przy obliczaniu grubości ścianki ta wartość jest zaokrąglana " +"do liczby całkowitej." + +msgctxt "wall_line_count label" +msgid "Wall Line Count" +msgstr "Liczba linii ściany" + +msgctxt "wall_line_width description" +msgid "Width of a single wall line." +msgstr "Szerokość jednej linii ściany." + +msgctxt "wall_line_width label" +msgid "Wall Line Width" +msgstr "Szerokość linii ściennych" + +msgctxt "wall_line_width_0 description" +msgid "" +"Width of the outermost wall line. By lowering this value, higher levels of " +"detail can be printed." +msgstr "" +"Szerokość linii najbliższa zewnętrznej ścianie. Przez obniżenie tej wartości " +"wyższe poziomy szczegółów mogą być drukowane." + +msgctxt "wall_line_width_0 label" +msgid "Outer Wall Line Width" +msgstr "Szerokość linii ścian zewnętrznych" + +msgctxt "wall_line_width_x description" +msgid "" +"Width of a single wall line for all wall lines except the outermost one." +msgstr "" +"Szerokość jednej linii dla wszystkich linii ściany z wyjątkiem jednej " +"najbardziej zewnętrznej." + +msgctxt "wall_line_width_x label" +msgid "Inner Wall(s) Line Width" +msgstr "Szerokość linii ścian wewnętrznych" + +msgctxt "wall_thickness description" +msgid "" +"The thickness of the outside walls in the horizontal direction. This value " +"divided by the wall line width defines the number of walls." +msgstr "" +"Grubość ścian zewnętrznych w kierunku poziomym. Ta wartość podzielona przez " +"szerokość linii ściennej określa liczbę ścian." + +msgctxt "wall_thickness label" +msgid "Wall Thickness" +msgstr "Grubość ścianki" + +msgctxt "wireframe_bottom_delay description" +msgid "Delay time after a downward move. Only applies to Wire Printing." +msgstr "Opóźnienie po przejściu w dół. Dotyczy tylko Drukowania drutu." + +msgctxt "wireframe_bottom_delay label" +msgid "WP Bottom Delay" +msgstr "W dół opóźnienia w drukowaniu ze strukturą drucianą" + +msgctxt "wireframe_drag_along description" +msgid "" +"Distance with which the material of an upward extrusion is dragged along " +"with the diagonally downward extrusion. This distance is compensated for. " +"Only applies to Wire Printing." +msgstr "" +"Odległość, z jaką przecina się materiał wytłoczony do góry wraz z " +"wytłoczeniem po przekątnej. Ta odległość jest kompensowana. Dotyczy tylko " +"Drukowania drutu." + +msgctxt "wireframe_drag_along label" +msgid "WP Drag Along" +msgstr "Dokręcić przypadku drukowania ze strukturą drucianą" + +msgctxt "wireframe_enabled description" +msgid "" +"Print only the outside surface with a sparse webbed structure, printing 'in " +"thin air'. This is realized by horizontally printing the contours of the " +"model at given Z intervals which are connected via upward and diagonally " +"downward lines." +msgstr "" +"Wydrukuj tylko zewnętrzną powierzchnię o słabej strukturze tkaniny, drukując " +"\"w cienkim powietrzu\". Jest to realizowane poprzez poziomy wydruk konturów " +"modelu w określonych przedziałach Z, które są połączone przez linie " +"skierowane w górę iw dół." + +msgctxt "wireframe_enabled label" +msgid "Wire Printing" +msgstr "Drukowanie druków" + +msgctxt "wireframe_fall_down description" +msgid "" +"Distance with which the material falls down after an upward extrusion. This " +"distance is compensated for. Only applies to Wire Printing." +msgstr "" +"Odległość spada materiału przez wytłaczanie w górę. Trasa ta jest " +"kompensowana. Odnosi się tylko do drukowania ze strukturą drucianą." + +msgctxt "wireframe_fall_down label" +msgid "WP Fall Down" +msgstr "Upaść podczas strukturze drutu drukowanie" + +msgctxt "wireframe_flat_delay description" +msgid "" +"Delay time between two horizontal segments. Introducing such a delay can " +"cause better adhesion to previous layers at the connection points, while too " +"long delays cause sagging. Only applies to Wire Printing." +msgstr "" +"Czas opóźnienia dwóch poziomych odcinków. Dzięki takiej zwłoki lepsze " +"przyleganie można uzyskać w punktach połączeń z poprzednich warstwach; przy " +"zbyt dużym opóźnieniem może jednak prowadzić do zatonięcia komponentów. " +"Odnosi się tylko do drukowania ze strukturą drucianą." + +msgctxt "wireframe_flat_delay label" +msgid "WP Flat Delay" +msgstr "Opóźnienie w drukowaniu z poziomej konstrukcji z drutu" + +msgctxt "wireframe_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value. Only applies to Wire Printing." +msgstr "" +"Kompensacja przepływu: Wytłaczany ilość materiału jest mnożone przez tę " +"wartość. Odnosi się tylko do drukowania ze strukturą drucianą." + +msgctxt "wireframe_flow label" +msgid "WP Flow" +msgstr "Płynąć do druku struktury drutu" + +msgctxt "wireframe_flow_connection description" +msgid "Flow compensation when going up or down. Only applies to Wire Printing." +msgstr "" +"Kompensacja przepływu w górę iw dół. Odnosi się tylko do drukowania ze " +"strukturą drucianą." + +msgctxt "wireframe_flow_connection label" +msgid "WP Connection Flow" +msgstr "Płynąć do połączeń Drukowanie za pomocą konstrukcji z drutu" + +msgctxt "wireframe_flow_flat description" +msgid "" +"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgstr "" +"Kompensacja przepływu podczas drukowania płaskich linii. Dotyczy tylko " +"Drukowania drutu." + +msgctxt "wireframe_flow_flat label" +msgid "WP Flat Flow" +msgstr "Przepływ do druku płaskiego linii ze struktury z drutu" + +msgctxt "wireframe_height description" +msgid "" +"The height of the upward and diagonally downward lines between two " +"horizontal parts. This determines the overall density of the net structure. " +"Only applies to Wire Printing." +msgstr "" +"Wysokość w górę i po przekątnej linii między dwiema częściami poziomymi. " +"Określa ona całkowitą gęstość struktury netto. Dotyczy tylko Drukowania " +"drutu." + +msgctxt "wireframe_height label" +msgid "WP Connection Height" +msgstr "Wysokość przyłącza przy drukowaniu o strukturze drucianej" + +msgctxt "wireframe_nozzle_clearance description" +msgid "" +"Distance between the nozzle and horizontally downward lines. Larger " +"clearance results in diagonally downward lines with a less steep angle, " +"which in turn results in less upward connections with the next layer. Only " +"applies to Wire Printing." +msgstr "" +"Odległość między dyszą a liniami skierowanymi w dół. Większe prześwity " +"powodują ukośne skierowanie w dół linii o mniej stromym kącie, co z kolei " +"skutkuje mniejszymi połączeniami z następną warstwą. Dotyczy tylko " +"Drukowania drutu." + +msgctxt "wireframe_nozzle_clearance label" +msgid "WP Nozzle Clearance" +msgstr "Rozdzielacze dysz WP" + +msgctxt "wireframe_printspeed description" +msgid "" +"Speed at which the nozzle moves when extruding material. Only applies to " +"Wire Printing." +msgstr "" +"Prędkość, w której dysze przemieszczają się podczas wytłaczania materiału. " +"Dotyczy tylko Drukowania drutu." + +msgctxt "wireframe_printspeed label" +msgid "WP Speed" +msgstr "Prędkość przy drukowaniu ze strukturą drucianą" + +msgctxt "wireframe_printspeed_bottom description" +msgid "" +"Speed of printing the first layer, which is the only layer touching the " +"build platform. Only applies to Wire Printing." +msgstr "" +"Prędkość drukowania pierwszej warstwy, która jest jedyną warstwą dotykającą " +"platformy build. Dotyczy tylko Drukowania drutu." + +msgctxt "wireframe_printspeed_bottom label" +msgid "WP Bottom Printing Speed" +msgstr "Prędkość druku w dolnej części strony" + +msgctxt "wireframe_printspeed_down description" +msgid "" +"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgstr "" +"Prędkość przy drukowaniu linii ukośnie ku dołowi. Odnosi się tylko do " +"drukowania ze strukturą drucianą." + +msgctxt "wireframe_printspeed_down label" +msgid "WP Downward Printing Speed" +msgstr "Prędkość podczas drukowania w dół ze strukturą drucianą" + +msgctxt "wireframe_printspeed_flat description" +msgid "" +"Speed of printing the horizontal contours of the model. Only applies to Wire " +"Printing." +msgstr "" +"Prędkość podczas drukowania poziome konturów modelu. Odnosi się tylko do " +"drukowania ze strukturą drucianą." + +msgctxt "wireframe_printspeed_flat label" +msgid "WP Horizontal Printing Speed" +msgstr "Prędkość drukowania poziomego WP" + +msgctxt "wireframe_printspeed_up description" +msgid "" +"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgstr "" +"Szybkość drukowania linii „pływający” w kierunku do góry. Odnosi się tylko " +"do drukowania ze strukturą drucianą." + +msgctxt "wireframe_printspeed_up label" +msgid "WP Upward Printing Speed" +msgstr "Prędkość podczas drukowania w kierunku do góry ze strukturą drucianą" + +msgctxt "wireframe_roof_drag_along description" +msgid "" +"The distance of the end piece of an inward line which gets dragged along " +"when going back to the outer outline of the roof. This distance is " +"compensated for. Only applies to Wire Printing." +msgstr "" +"Odległość od końcówki rozciągającego się do wewnątrz wokół linii którym jest " +"zaciśnięte na powrót do zewnętrznej linii obwodowej dachu. Trasa ta jest " +"kompensowana. Odnosi się tylko do drukowania ze strukturą drucianą." + +msgctxt "wireframe_roof_drag_along label" +msgid "WP Roof Drag Along" +msgstr "Dokręcić dach podczas drukowania ze strukturą drucianą" + +msgctxt "wireframe_roof_fall_down description" +msgid "" +"The distance which horizontal roof lines printed 'in thin air' fall down " +"when being printed. This distance is compensated for. Only applies to Wire " +"Printing." +msgstr "" +"Odległość, na jaką drukowane są poziome linie dachu \"w cienkim powietrzu\". " +"Ta odległość jest kompensowana. Dotyczy tylko Drukowania drutu." + +msgctxt "wireframe_roof_fall_down label" +msgid "WP Roof Fall Down" +msgstr "Spada z dachu podczas drukowania ze strukturą drucianą" + +msgctxt "wireframe_roof_inset description" +msgid "" +"The distance covered when making a connection from a roof outline inward. " +"Only applies to Wire Printing." +msgstr "" +"Zadaszony odległość podczas nawiązywania połączenia z konturem dachu do " +"środka. Odnosi się tylko do drukowania ze strukturą drucianą." + +msgctxt "wireframe_roof_inset label" +msgid "WP Roof Inset Distance" +msgstr "Odległość wstawka na dachu przy drukowaniu ze strukturą drucianą" + +msgctxt "wireframe_roof_outer_delay description" +msgid "" +"Time spent at the outer perimeters of hole which is to become a roof. Longer " +"times can ensure a better connection. Only applies to Wire Printing." +msgstr "" +"Czas, który poświęca się na zewnętrznych obrzeżach otworu, który ma stać się " +"dach później. połączenie może być lepiej z dłuższymi czasami. Odnosi się " +"tylko do drukowania ze strukturą drucianą." + +msgctxt "wireframe_roof_outer_delay label" +msgid "WP Roof Outer Delay" +msgstr "Opóźnienia dla obwodów dachowych przy drukowaniu ze strukturą drucianą" + +msgctxt "wireframe_straight_before_down description" +msgid "" +"Percentage of a diagonally downward line which is covered by a horizontal " +"line piece. This can prevent sagging of the top most point of upward lines. " +"Only applies to Wire Printing." +msgstr "" +"Odsetek linii przekątnej w dół, która jest przykryta poziomą linią. Może to " +"uniemożliwić zwielokrotnienie górnej krawędzi w górę. Dotyczy tylko " +"Drukowania drutu." + +msgctxt "wireframe_straight_before_down label" +msgid "WP Straighten Downward Lines" +msgstr "WP Prostuj linie w dół" + +msgctxt "wireframe_strategy description" +msgid "" +"Strategy for making sure two consecutive layers connect at each connection " +"point. Retraction lets the upward lines harden in the right position, but " +"may cause filament grinding. A knot can be made at the end of an upward line " +"to heighten the chance of connecting to it and to let the line cool; " +"however, it may require slow printing speeds. Another strategy is to " +"compensate for the sagging of the top of an upward line; however, the lines " +"won't always fall down as predicted." +msgstr "" +"Strategia zapewniająca podłączenie dwóch kolejnych warstw w każdym punkcie " +"połączenia. Odsunięcie pozwala na utwardzenie w górę pozycji we właściwej " +"pozycji, ale może powodować mielenie filamentów. Sieć węzła może być " +"wykonana na końcu linii do góry, aby zwiększyć szanse na połączenie z nią i " +"pozostawić linię chłodną; Może to jednak wymagać szybkich prędkości druku. " +"Inną strategią jest wyrównanie opadania górnej krawędzi w górę; Jednak linie " +"nie zawsze spadają zgodnie z przewidywaniami." + +msgctxt "wireframe_strategy label" +msgid "WP Strategy" +msgstr "Strategia dla konstrukcji z drutu drukowanie" + +msgctxt "wireframe_strategy option compensate" +msgid "Compensate" +msgstr "Kompensować" + +msgctxt "wireframe_strategy option knot" +msgid "Knot" +msgstr "Węzeł" + +msgctxt "wireframe_strategy option retract" +msgid "Retract" +msgstr "Wycofanie" + +msgctxt "wireframe_top_delay description" +msgid "" +"Delay time after an upward move, so that the upward line can harden. Only " +"applies to Wire Printing." +msgstr "" +"Opóżnienie czasu po wzniesieniu w górę, tak aby linia w górę mogła się " +"zesztywniać. Dotyczy tylko Drukowania drutu." + +msgctxt "wireframe_top_delay label" +msgid "WP Top Delay" +msgstr "Up opóźnienia w drukowaniu ze strukturą drucianą" + +msgctxt "wireframe_top_jump description" +msgid "" +"Creates a small knot at the top of an upward line, so that the consecutive " +"horizontal layer has a better chance to connect to it. Only applies to Wire " +"Printing." +msgstr "" +"Tworzy mały węzeł u góry linii w górę, dzięki czemu kolejna pozioma warstwa " +"ma większą szansę połączenia się z nią. Dotyczy tylko Drukowania drutu." + +msgctxt "wireframe_top_jump label" +msgid "WP Knot Size" +msgstr "Rozmiar węzła do druku struktury drutu" + +msgctxt "wireframe_up_half_speed description" +msgid "" +"Distance of an upward move which is extruded with half speed.\n" +"This can cause better adhesion to previous layers, while not heating the " +"material in those layers too much. Only applies to Wire Printing." +msgstr "" +"Dystans przemieszczania się ku górze, która jest wytłaczana z połową " +"szybkości.\n" +"Może to prowadzić do lepszej przyczepności do wcześniejszych warstwach, a " +"przegrzanie materiału unika się w tych warstwach. Odnosi się tylko do " +"drukowania ze strukturą drucianą." + +msgctxt "wireframe_up_half_speed label" +msgid "WP Ease Upward" +msgstr "Przy drukowaniu o strukturze drucianej powolny ruch ku górze" + +msgctxt "xy_offset description" +msgid "" +"Amount of offset applied to all polygons in each layer. Positive values can " +"compensate for too big holes; negative values can compensate for too small " +"holes." +msgstr "" +"Wysokość przesunięcia zastosowana do wszystkich wieloboków w każdej " +"warstwie. Pozytywne wartości mogą kompensować zbyt duże otwory; Wartości " +"ujemne mogą kompensować zbyt małe otwory." + +msgctxt "xy_offset label" +msgid "Horizontal Expansion" +msgstr "Rozszerzenie poziome" + +msgctxt "z_seam_type description" +msgid "" +"Starting point of each path in a layer. When paths in consecutive layers " +"start at the same point a vertical seam may show on the print. When aligning " +"these near a user specified location, the seam is easiest to remove. When " +"placed randomly the inaccuracies at the paths' start will be less " +"noticeable. When taking the shortest path the print will be quicker." +msgstr "" +"Punkt początkowy każdej ścieżki w warstwie. Kiedy ścieżki w kolejnych " +"warstwach zaczynają się w tym samym punkcie, na wydruku może pojawić się " +"pionowy szew. Wyrównywanie ich w pobliżu określonej przez użytkownika " +"lokalizacji powoduje, że szew jest najprostszy do usunięcia. Po umieszczeniu " +"losowo niedokładności na początku ścieżki będzie mniej zauważalny. Podczas " +"najkrótszej drogi wydruk będzie szybszy." + +msgctxt "z_seam_type label" +msgid "Z Seam Alignment" +msgstr "Wyrównanie szwu Z" + +msgctxt "z_seam_type option back" +msgid "User Specified" +msgstr "Użytkownik został określony" + +msgctxt "z_seam_type option random" +msgid "Random" +msgstr "Losowa" + +msgctxt "z_seam_type option shortest" +msgid "Shortest" +msgstr "Najkrótsza" + +msgctxt "z_seam_x description" +msgid "" +"The X coordinate of the position near where to start printing each part in a " +"layer." +msgstr "" +"Współrzędna X położenia, w pobliżu miejsca rozpoczęcia drukowania każdej " +"części w warstwie." + +msgctxt "z_seam_x label" +msgid "Z Seam X" +msgstr "Z-X szew" + +msgctxt "z_seam_y description" +msgid "" +"The Y coordinate of the position near where to start printing each part in a " +"layer." +msgstr "" +"Współrzędna Y położenia, w pobliżu miejsca rozpoczęcia drukowania każdej " +"części w warstwie." + +msgctxt "z_seam_y label" +msgid "Z Seam Y" +msgstr "Z-Y szew" From 8fb21b39ad1a967a423714da38bf36b86c4c6325 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 10:47:24 +0200 Subject: [PATCH 310/379] Correct metadata of Polish translations The correct author, etc. Contributes to issue CURA-3998. --- resources/i18n/pl/cura.po | 20 +++++++++++--------- resources/i18n/pl/fdmextruder.def.json.po | 16 +++++++++++----- resources/i18n/pl/fdmprinter.def.json.po | 16 +++++++++++----- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index 9d6261e634..c9cb4a435a 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -1,17 +1,19 @@ -# English translations for PACKAGE package. -# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Automatically generated, 2017. +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. # msgid "" msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" +"Project-Id-Version: Cura 2.6\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0200\n" "PO-Revision-Date: 2017-07-13 15:58+0200\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: pl_PL\n" +"Last-Translator: jagus85\n" +"Language-Team: reprapy.pl\n" +"Language: Polish\n" +"Lang-Code: pl\n" +"Country-Code: PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/resources/i18n/pl/fdmextruder.def.json.po b/resources/i18n/pl/fdmextruder.def.json.po index 6f1d548bcd..52ff4fc392 100644 --- a/resources/i18n/pl/fdmextruder.def.json.po +++ b/resources/i18n/pl/fdmextruder.def.json.po @@ -1,17 +1,23 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# msgid "" msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" "PO-Revision-Date: 2017-07-13 16:08+0200\n" -"Last-Translator: Bothof \n" -"Language-Team: German\n" -"Language: de\n" -"Lang-Code: de\n" -"Country-Code: DE\n" +"Last-Translator: jagus85\n" +"Language-Team: reprapy.pl\n" +"Language: Polish\n" +"Lang-Code: pl\n" +"Country-Code: PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.2\n" msgctxt "extruder_nr description" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index f1fadf0bad..39a1be87e0 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -1,17 +1,23 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# msgid "" msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" "PO-Revision-Date: 2017-07-17 01:20+0200\n" -"Last-Translator: Bothof \n" -"Language-Team: German\n" -"Language: de\n" -"Lang-Code: de\n" -"Country-Code: DE\n" +"Last-Translator: jagus85\n" +"Language-Team: reprapy.pl\n" +"Language: Polish\n" +"Lang-Code: pl\n" +"Country-Code: PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.2\n" msgctxt "acceleration_enabled description" From 573d25982e57990eefd386f955e77490e0b1c4f9 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 18 Jul 2017 11:22:37 +0200 Subject: [PATCH 311/379] Minor cleanup of SettingOverrideDecorator We never use the _instance variable except in deepcopy, so no need to store that. Contributes to CURA-3719 --- cura/Settings/SettingOverrideDecorator.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index d754b6bc6d..503e0b2490 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -26,8 +26,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): super().__init__() self._stack = ContainerStack(stack_id = id(self)) self._stack.setDirty(False) # This stack does not need to be saved. - self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer") - self._stack.addContainer(self._instance) + self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer")) if ExtruderManager.getInstance().extruderCount > 1: self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() @@ -46,13 +45,14 @@ class SettingOverrideDecorator(SceneNodeDecorator): ## Create a fresh decorator object deep_copy = SettingOverrideDecorator() ## Copy the instance - deep_copy._instance = copy.deepcopy(self._instance, memo) + instance_container = copy.deepcopy(self._stack.getContainer(0), memo) + + ## Set the copied instance as the first (and only) instance container of the stack. + deep_copy._stack.replaceContainer(0, instance_container) # Properly set the right extruder on the copy deep_copy.setActiveExtruder(self._extruder_stack) - ## Set the copied instance as the first (and only) instance container of the stack. - deep_copy._stack.replaceContainer(0, deep_copy._instance) return deep_copy ## Gets the currently active extruder to print this object with. From 500211941a36a25a372c675334d7fe7dc3312460 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 11:21:01 +0200 Subject: [PATCH 312/379] Fix spelling of 'Volumatric' Contributes to issue CURA-3998. --- 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 dca938854a..4186a74a74 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -304,7 +304,7 @@ "options": { "RepRap (Marlin/Sprinter)": "Marlin", - "RepRap (Volumatric)": "Marlin (Volumetric)", + "RepRap (Volumetric)": "Marlin (Volumetric)", "RepRap (RepRap)": "RepRap", "UltiGCode": "Ultimaker 2", "Griffin": "Griffin", From de8a700bd46fefeb587040e6a7209fa2e25b1f31 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 12:49:19 +0200 Subject: [PATCH 313/379] Fix spelling of statistics sending message Found while working on CURA-3998. --- plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index a51e96aa9c..0af9c85607 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -40,7 +40,7 @@ class SliceInfo(Extension): Preferences.getInstance().addPreference("info/asked_send_slice_info", False) if not Preferences.getInstance().getValue("info/asked_send_slice_info"): - self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymised slicing statistics. You can disable this in preferences"), lifetime = 0, dismissable = False) + self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymised slicing statistics. You can disable this in the preferences."), lifetime = 0, dismissable = False) self.send_slice_info_message.addAction("Dismiss", catalog.i18nc("@action:button", "Dismiss"), None, "") self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) self.send_slice_info_message.show() From 3c545ba7c906fd5c5b5668bb0bc9f28e5aa991ad Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 12:53:46 +0200 Subject: [PATCH 314/379] Clarify context of print info bounding box size translation Lots of translators did this wrong. Contributes to issue CURA-3998. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 211c98782e..ab209e83cf 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -806,7 +806,7 @@ class CuraApplication(QtApplication): @pyqtProperty(str, notify = sceneBoundingBoxChanged) def getSceneBoundingBoxString(self): - return self._i18n_catalog.i18nc("@info", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()} + return self._i18n_catalog.i18nc("@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm.", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()} def updatePlatformActivity(self, node = None): count = 0 From dbcf50162f6178208b0702362fe365c9c8cb7a29 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 12:56:11 +0200 Subject: [PATCH 315/379] Fix spelling of combined English words Contributes to issue CURA-3998. --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index f9af47fc7a..78c4d2d1a5 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -193,7 +193,7 @@ Cura.MachineAction wrapMode: Text.WordWrap //: Tips label //TODO: get actual link from webteam - text: catalog.i18nc("@label", "If your printer is not listed, read the network-printing troubleshooting guide").arg("https://ultimaker.com/en/troubleshooting"); + text: catalog.i18nc("@label", "If your printer is not listed, read the network printing troubleshooting guide").arg("https://ultimaker.com/en/troubleshooting"); onLinkActivated: Qt.openUrlExternally(link) } From 390981bbb52dbca4364829cad5df94314d601600 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 13:01:24 +0200 Subject: [PATCH 316/379] Fix superfluous space in translated text Found while working on CURA-3998. --- resources/qml/AboutDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml index 8c2d982b1d..4c4391c2a1 100644 --- a/resources/qml/AboutDialog.qml +++ b/resources/qml/AboutDialog.qml @@ -125,7 +125,7 @@ UM.Dialog projectsModel.append({ name:"PyQt", description: catalog.i18nc("@label", "GUI framework bindings"), license: "GPL", url: "https://riverbankcomputing.com/software/pyqt" }); projectsModel.append({ name:"SIP", description: catalog.i18nc("@label", "C/C++ Binding library"), license: "GPL", url: "https://riverbankcomputing.com/software/sip" }); projectsModel.append({ name:"Protobuf", description: catalog.i18nc("@label", "Data interchange format"), license: "BSD", url: "https://developers.google.com/protocol-buffers" }); - projectsModel.append({ name:"SciPy", description: catalog.i18nc("@label", "Support library for scientific computing "), license: "BSD-new", url: "https://www.scipy.org/" }); + projectsModel.append({ name:"SciPy", description: catalog.i18nc("@label", "Support library for scientific computing"), license: "BSD-new", url: "https://www.scipy.org/" }); projectsModel.append({ name:"NumPy", description: catalog.i18nc("@label", "Support library for faster math"), license: "BSD", url: "http://www.numpy.org/" }); projectsModel.append({ name:"NumPy-STL", description: catalog.i18nc("@label", "Support library for handling STL files"), license: "BSD", url: "https://github.com/WoLpH/numpy-stl" }); projectsModel.append({ name:"libSavitar", description: catalog.i18nc("@label", "Support library for handling 3MF files"), license: "AGPLv3", url: "https://github.com/ultimaker/libsavitar" }); From c1a68379f540c61c7c9716345c54d601c81bdb3b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 13:04:05 +0200 Subject: [PATCH 317/379] Clarify context of automatic nozzle detection translation string Otherwise a translator will only see 'Automatic: %1', '%1 is the value from the printer', without knowing what kind of value that is then. Found while working on CURA-3998. --- resources/qml/Menus/NozzleMenu.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index 44f8cc8c85..a9fffc84ab 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the AGPLv3 or higher. import QtQuick 2.2 @@ -23,7 +23,7 @@ Menu if(printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex) { var nozzleName = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; - return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(nozzleName); + return catalog.i18nc("@title:menuitem %1 is the nozzle currently loaded in the printer", "Automatic: %1").arg(nozzleName); } return ""; } From 188b45791b8a7146a3cabdfebbaf24413c116852 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 13:09:26 +0200 Subject: [PATCH 318/379] Small consistency fixes for Polish translation I hope I wasn't overzealeous. Contributes to issue CURA-3998. --- resources/i18n/pl/cura.po | 70 ++++++++++++------------ resources/i18n/pl/fdmprinter.def.json.po | 42 +++++++------- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index c9cb4a435a..8f35a18036 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -78,7 +78,7 @@ msgstr "Zapisuje kod GCode do pliku" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:22 msgctxt "@item:inlistbox" msgid "GCode File" -msgstr "Plik GCode " +msgstr "Plik GCode" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:13 msgctxt "@label" @@ -103,7 +103,7 @@ msgstr "Drukuj z Doodle3D" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:38 msgctxt "@info:tooltip" msgid "Print with " -msgstr "Drukuj z" +msgstr "Drukuj z " #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:49 msgctxt "@title:menu" @@ -139,7 +139,7 @@ msgstr "Charakterystyka Profila" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/__init__.py:15 msgctxt "@info:whatsthis" msgid "Create a flattend quality changes profile." -msgstr "Utwórz profil charakterystyczny profil jakości" +msgstr "Utwórz profil charakterystyczny profil jakości." #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 msgctxt "@item:inmenu" @@ -215,7 +215,7 @@ msgstr "Zapisuje plik X3G" #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:22 msgctxt "X3G Writer File Description" msgid "X3G File" -msgstr "Plik X3G " +msgstr "Plik X3G" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -268,7 +268,7 @@ msgstr "Nie można zapisać na wymiennym dysku {0}: {1}" #, python-brace-format msgctxt "@info:status" msgid "Ejected {0}. You can now safely remove the drive." -msgstr "Wyjęto {0}. Teraz można bezpiecznie wyjąć napęd" +msgstr "Wyjęto {0}. Teraz można bezpiecznie wyjąć napęd." #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:150 #, python-brace-format @@ -512,7 +512,7 @@ msgstr "Modyfikować G-Code" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12 msgctxt "@label" msgid "Post Processing" -msgstr "Przetwarzanie " +msgstr "Przetwarzanie" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16 msgctxt "Description of plugin" @@ -572,7 +572,7 @@ msgstr "Zapewnia obsługę importowania profili w starszych wersjach Cura." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:21 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" -msgstr "Profile Cura 15.04 " +msgstr "Profile Cura 15.04" #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:12 msgctxt "@label" @@ -663,17 +663,17 @@ msgstr "Obraz JPEG" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:29 msgctxt "@item:inlistbox" msgid "PNG Image" -msgstr "Obraz PNG " +msgstr "Obraz PNG" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:33 msgctxt "@item:inlistbox" msgid "BMP Image" -msgstr "Obraz BMP " +msgstr "Obraz BMP" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:37 msgctxt "@item:inlistbox" msgid "GIF Image" -msgstr "Obraz GIF " +msgstr "Obraz GIF" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:272 #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:105 @@ -759,7 +759,7 @@ msgstr "Zapewnia obsługę czytania plików 3MF." #: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:44 msgctxt "@item:inlistbox" msgid "3MF File" -msgstr "Plik 3MF " +msgstr "Plik 3MF" #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:119 #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1047 @@ -800,7 +800,7 @@ msgstr "Plik G-kod" #: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 msgctxt "@info:status" msgid "Parsing G-code" -msgstr "Analizowanie G-kodu" +msgstr "Analizowanie G-kodu" #: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:365 msgctxt "@info:generic" @@ -836,7 +836,7 @@ msgstr "Zapewnia obsługę pisania plików 3MF." #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:31 msgctxt "@item:inlistbox" msgid "3MF file" -msgstr "Pliki 3MF " +msgstr "Pliki 3MF" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:39 msgctxt "@item:inlistbox" @@ -1041,7 +1041,7 @@ msgstr "Ładowanie interfejsu ..." #, python-format msgctxt "@info" msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(szerokość).1f x %(głębokość).1f x %(wysokość).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1263 #, python-brace-format @@ -1202,7 +1202,7 @@ msgstr "Extruder End Gcode" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:20 msgctxt "@title:window" msgid "Doodle3D Settings" -msgstr "Ustawienia Doodle3D " +msgstr "Ustawienia Doodle3D" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:53 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 @@ -1260,7 +1260,7 @@ msgstr "Aktualizacja firmware" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:40 msgctxt "@label" msgid "Firmware update completed." -msgstr "Aktualizacja firmware zakończona" +msgstr "Aktualizacja firmware zakończona." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:45 msgctxt "@label" @@ -1536,7 +1536,7 @@ msgstr "Szerokość w milimetrach na płycie podłoża." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 msgctxt "@action:label" msgid "Width (mm)" -msgstr "Szerokość(mm)" +msgstr "Szerokość (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" @@ -1825,7 +1825,7 @@ msgstr "Rozpocznij sprawdzanie drukarki" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 msgctxt "@label" msgid "Connection: " -msgstr "Połączenie:" +msgstr "Połączenie: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" @@ -1840,7 +1840,7 @@ msgstr "Nie połączono" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 msgctxt "@label" msgid "Min endstop X: " -msgstr "Min . Krańcówki X: " +msgstr "Min. Krańcówki X: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 @@ -1861,12 +1861,12 @@ msgstr "Niesprawdzone" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 msgctxt "@label" msgid "Min endstop Y: " -msgstr "Min . Krańcówki Y: " +msgstr "Min. Krańcówki Y: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 msgctxt "@label" msgid "Min endstop Z: " -msgstr "Min . Krańcówki Z: " +msgstr "Min. Krańcówki Z: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 msgctxt "@label" @@ -2160,7 +2160,7 @@ msgstr "Łącznik" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137 msgctxt "@label" msgid "Language:" -msgstr "Język" +msgstr "Język:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:194 msgctxt "@label" @@ -2582,7 +2582,7 @@ msgstr "Udało się wyeksportować materiał do %1" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:783 msgctxt "@title:window" msgid "Add Printer" -msgstr "Dodaj drukarkę..." +msgstr "Dodaj drukarkę" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 msgctxt "@label" @@ -2617,17 +2617,17 @@ msgstr "Wypełnienie" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:183 msgctxt "@tooltip" msgid "Support Infill" -msgstr "Wypełnienie podpór " +msgstr "Wypełnienie podpór" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:184 msgctxt "@tooltip" msgid "Support Interface" -msgstr "Łącznenie podpór " +msgstr "Łącznenie podpór" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:185 msgctxt "@tooltip" msgid "Support" -msgstr "Wsparcie/Podpory " +msgstr "Wsparcie/Podpory" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:186 msgctxt "@tooltip" @@ -2662,7 +2662,7 @@ msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" msgid "About Cura" -msgstr "O Cura3d" +msgstr "O Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -2706,7 +2706,7 @@ msgstr "Język programowania" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 msgctxt "@label" msgid "GUI framework" -msgstr "Struktura GUI " +msgstr "Struktura GUI" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 msgctxt "@label" @@ -2726,7 +2726,7 @@ msgstr "Format wymiany danych" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 msgctxt "@label" msgid "Support library for scientific computing " -msgstr "Biblioteka wsparcia dla komputerów naukowych" +msgstr "Biblioteka wsparcia dla komputerów naukowych " #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 msgctxt "@label" @@ -2937,7 +2937,7 @@ msgstr "Blok grzejny/hotend" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:119 msgctxt "@tooltip" msgid "The current temperature of this extruder." -msgstr "Bieżąca temperatura głowicy drukującej" +msgstr "Bieżąca temperatura głowicy drukującej." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:154 msgctxt "@tooltip" @@ -3077,7 +3077,7 @@ msgstr "Pokaż dokumentację internetową" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" -msgstr "Zgłoś błąd" +msgstr "&Zgłoś błąd" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 msgctxt "@action:inmenu menubar:help" @@ -3088,8 +3088,8 @@ msgstr "&Temat" msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" -msgstr[0] "Usuń & wybrany model" -msgstr[1] "Usuń & wybrany modele" +msgstr[0] "Usuń &wybrany model" +msgstr[1] "Usuń &wybrany modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 msgctxt "@action:inmenu menubar:edit" @@ -3173,7 +3173,7 @@ msgstr "Zresetuj wszystkie modele i transformacje" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." -msgstr "&Otwórz pliki ..." +msgstr "&Otwórz pliki ..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 msgctxt "@action:inmenu menubar:file" @@ -3326,7 +3326,7 @@ msgstr "&Rozszerzenia" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:218 msgctxt "@title:menu menubar:toplevel" msgid "P&references" -msgstr "Preferencje" +msgstr "Pre&ferencje" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:226 msgctxt "@title:menu menubar:toplevel" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index 39a1be87e0..1c47516457 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -383,7 +383,7 @@ msgstr "" msgctxt "coasting_enable label" msgid "Enable Coasting" -msgstr "Włącz (Coasting) " +msgstr "Włącz (Coasting)" msgctxt "coasting_min_volume description" msgid "" @@ -675,7 +675,7 @@ msgstr "" msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" -msgstr "Aktywować przedniej szyby(Draft Shield)" +msgstr "Aktywować przedniej szyby (Draft Shield)" msgctxt "draft_shield_height description" msgid "" @@ -1137,7 +1137,7 @@ msgstr "" msgctxt "jerk_infill label" msgid "Infill Jerk" -msgstr "Wypełnienie Funkcja szarpnięcie(jerk)" +msgstr "Wypełnienie Funkcja szarpnięcie (jerk)" msgctxt "jerk_layer_0 description" msgid "The print maximum instantaneous velocity change for the initial layer." @@ -1145,7 +1145,7 @@ msgstr "Maksymalna zmiana chwilowej prędkości dla pierwszej warstwy." msgctxt "jerk_layer_0 label" msgid "Initial Layer Jerk" -msgstr "Funkcja szarpnięcie(jerk) pierwszej warstwie" +msgstr "Funkcja szarpnięcie (jerk) pierwszej warstwie" msgctxt "jerk_prime_tower description" msgid "" @@ -1207,7 +1207,7 @@ msgstr "Maksymalna szybkość zmiany chwilowej, z jaką są drukowane podłoża. msgctxt "jerk_support_bottom label" msgid "Support Floor Jerk" -msgstr "Funkcja szarpnięcie(jerk) struktury podłoża" +msgstr "Funkcja szarpnięcie (jerk) struktury podłoża" msgctxt "jerk_support_infill description" msgid "" @@ -1219,7 +1219,7 @@ msgstr "" msgctxt "jerk_support_infill label" msgid "Support Infill Jerk" -msgstr "Funkcja szarpnięcie(jerk) konstrukcja nośna wypełniania" +msgstr "Funkcja szarpnięcie (jerk) konstrukcja nośna wypełniania" msgctxt "jerk_support_interface description" msgid "" @@ -1231,7 +1231,7 @@ msgstr "" msgctxt "jerk_support_interface label" msgid "Support Interface Jerk" -msgstr "Funkcja szarpnięcie(jerk) interfejs konstrukcja nośna" +msgstr "Funkcja szarpnięcie (jerk) interfejs konstrukcja nośna" msgctxt "jerk_support_roof description" msgid "" @@ -1243,7 +1243,7 @@ msgstr "" msgctxt "jerk_support_roof label" msgid "Support Roof Jerk" -msgstr "Funkcja szarpnięcie(jerk) do konstrukcji dachu" +msgstr "Funkcja szarpnięcie (jerk) do konstrukcji dachu" msgctxt "jerk_topbottom description" msgid "" @@ -1254,7 +1254,7 @@ msgstr "" msgctxt "jerk_topbottom label" msgid "Top/Bottom Jerk" -msgstr "Funkcja szarpnięcie(jerk) górnej / dolnej warstwy" +msgstr "Funkcja szarpnięcie (jerk) górnej / dolnej warstwy" msgctxt "jerk_travel description" msgid "" @@ -1282,7 +1282,7 @@ msgstr "Maksymalna różnica prędkości chwilowej z którego ściany są drukow msgctxt "jerk_wall label" msgid "Wall Jerk" -msgstr "Funkcja szarpnięcie(jerk) ścianki" +msgstr "Funkcja szarpnięcie (jerk) ścianki" msgctxt "jerk_wall_0 description" msgid "" @@ -1294,7 +1294,7 @@ msgstr "" msgctxt "jerk_wall_0 label" msgid "Outer Wall Jerk" -msgstr "Funkcja szarpnięcie(jerk) zewnątrz ścianki" +msgstr "Funkcja szarpnięcie (jerk) zewnątrz ścianki" msgctxt "jerk_wall_x description" msgid "" @@ -1306,7 +1306,7 @@ msgstr "" msgctxt "jerk_wall_x label" msgid "Inner Wall Jerk" -msgstr "Funkcja szarpnięcie(jerk) wewnętrznej ściance" +msgstr "Funkcja szarpnięcie (jerk) wewnętrznej ściance" msgctxt "layer_0_z_overlap description" msgid "" @@ -1508,7 +1508,7 @@ msgstr "Urządzenie głowica wielokąta" msgctxt "machine_head_with_fans_polygon description" msgid "A 2D silhouette of the print head (fan caps included)." -msgstr "2D kontur głowicy drukującej (CAPS wentylatora w zestawie)." +msgstr "2D kontur głowicy drukującej (caps wentylatora w zestawie)." msgctxt "machine_head_with_fans_polygon label" msgid "Machine head & Fan polygon" @@ -1608,7 +1608,7 @@ msgstr "Maksymalna prędkość Z" msgctxt "machine_max_jerk_e description" msgid "Default jerk for the motor of the filament." -msgstr "Domyślny szarpnięcie dla silnika filamentu" +msgstr "Domyślny szarpnięcie dla silnika filamentu." msgctxt "machine_max_jerk_e label" msgid "Default Filament Jerk" @@ -1620,7 +1620,7 @@ msgstr "Domyślny szarpnięcie za ruch w płaszczyźnie poziomej." msgctxt "machine_max_jerk_xy label" msgid "Default X-Y Jerk" -msgstr "Domyślna X Y Jerk" +msgstr "Domyślna X-Y Jerk" msgctxt "machine_max_jerk_z description" msgid "Default jerk for the motor of the Z-direction." @@ -2705,7 +2705,7 @@ msgstr "Funkcja jerk, z którym tratwa zostanie wydrukowany." msgctxt "raft_jerk label" msgid "Raft Print Jerk" -msgstr "Funkcja szarpnięcie(jerk) Tratwa Drukuj" +msgstr "Funkcja szarpnięcie (jerk) Tratwa Drukuj" msgctxt "raft_margin description" msgid "" @@ -2747,11 +2747,11 @@ msgstr "Szybkość wentylatora górnej warstwy tratwy" msgctxt "raft_surface_jerk description" msgid "The jerk with which the top raft layers are printed." -msgstr "Przyśpieszenie(jerk), z którym są drukowane górne warstwy tratwy." +msgstr "Przyśpieszenie (jerk), z którym są drukowane górne warstwy tratwy." msgctxt "raft_surface_jerk label" msgid "Raft Top Print Jerk" -msgstr "Góra tratwy przyśpieszenie (Jerk)" +msgstr "Góra tratwy przyśpieszenie (jerk)" msgctxt "raft_surface_layers description" msgid "" @@ -3124,7 +3124,7 @@ msgstr "Szerokość pojedynczej linii Skirt lub Brim" msgctxt "skirt_brim_line_width label" msgid "Skirt/Brim Line Width" -msgstr "Skirt(Spódnica)-/Brim(rondo)-Szerokość linii" +msgstr "Skirt- (spódnica) / Brim- (rondo) Szerokość linii" msgctxt "skirt_brim_minimal_length description" msgid "" @@ -3377,7 +3377,7 @@ msgstr "" msgctxt "speed_support label" msgid "Support Speed" -msgstr "Prędkość podpór." +msgstr "Prędkość podpór" msgctxt "speed_support_bottom description" msgid "" @@ -3441,7 +3441,7 @@ msgstr "Prędkość, w jakiej wykonywane są przemieszczenia." msgctxt "speed_travel label" msgid "Travel Speed" -msgstr "Szybkość przemieszczania." +msgstr "Szybkość przemieszczania" msgctxt "speed_travel_layer_0 description" msgid "" From b2853ef13901e145296e4f92622161485365bb9d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 13:46:10 +0200 Subject: [PATCH 319/379] Add Polish language to drop-down The translation is complete for 2.6 (albeit apparently wrong in several places). It is not yet complete for master, but that will come during the translation update for the 2.7 beta. Contributes to issue CURA-3998. --- resources/qml/Preferences/GeneralPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 260c23c4ba..7460504c3f 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -157,6 +157,7 @@ UM.PreferencesPage append({ text: "日本語", code: "jp" }) append({ text: "한국어", code: "ko" }) append({ text: "Nederlands", code: "nl" }) + append({ text: "Polszczyzna", code: "pl" }) append({ text: "Português do Brasil", code: "ptbr" }) append({ text: "Русский", code: "ru" }) append({ text: "Türkçe", code: "tr" }) From 515ec0d2d9b52031b4d63e09a3bd44c84f042816 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 13:57:40 +0200 Subject: [PATCH 320/379] Add missing space Contributes to issue CURA-3998. --- resources/i18n/pl/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index 8f35a18036..7c4a2eacc2 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -3476,7 +3476,7 @@ msgstr "Włącz drukowanie obrysu lub tratwy. Spowoduje to dodanie płaskiej pow #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:511 msgctxt "@label" msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" -msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
PrzeczytaćInstrukcje dotyczące rozwiązywania problemów z Ultimaker" +msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
Przeczytać Instrukcje dotyczące rozwiązywania problemów z Ultimaker" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label" From 54ef959cfc4fdc9701d9dcc727059ca7b4147b8b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 14:06:44 +0200 Subject: [PATCH 321/379] Fix translation of 'Polish' Yeah, Wikipedia wasn't very clear on that. Contributes to issue CURA-3998. --- resources/qml/Preferences/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 7460504c3f..7c4ad16e10 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -157,7 +157,7 @@ UM.PreferencesPage append({ text: "日本語", code: "jp" }) append({ text: "한국어", code: "ko" }) append({ text: "Nederlands", code: "nl" }) - append({ text: "Polszczyzna", code: "pl" }) + append({ text: "Polski", code: "pl" }) append({ text: "Português do Brasil", code: "ptbr" }) append({ text: "Русский", code: "ru" }) append({ text: "Türkçe", code: "tr" }) From d595e76a8877bffceee86da2e907cc2805dbdc37 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 15:56:28 +0200 Subject: [PATCH 322/379] Add instructions for creating translations Contributes to issue CURA-3998. --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 256bbbd55b..b843be9a66 100644 --- a/README.md +++ b/README.md @@ -68,3 +68,25 @@ There are two ways of doing it. You can either use the generator [here](http://q * If your printer has a heated bed, set visible to true under material_bed_temperature Once you are done, put the profile you have made into resources/definitions, or in definitions in your cura profile folder. + +Translating Cura +---------------- +If you'd like to contribute a translation of Cura, please first look for [any existing translation](https://github.com/Ultimaker/Cura/tree/master/resources/i18n). If your language is already there in the source code but not in Cura's interface, it may be partially translated. + +There are four files that need to be translated for Cura: +1. https://github.com/Ultimaker/Cura/blob/master/resources/i18n/cura.pot +2. https://github.com/Ultimaker/Cura/blob/master/resources/i18n/fdmextruder.def.json.pot +3. https://github.com/Ultimaker/Cura/blob/master/resources/i18n/fdmprinter.def.json.pot (This one is the most work.) +4. https://github.com/Ultimaker/Uranium/blob/master/resources/i18n/uranium.pot + +Copy these files and rename them to `*.po` (remove the `t`). Then create the actual translations by filling in the empty `msgstr` entries. These are gettext files, which are plain text so you can open them with any text editor such as Notepad or GEdit, but it is probably easier with a specialised tool such as [POEdit](https://poedit.net/) or [Virtaal](http://virtaal.translatehouse.org/). + +Do not hestiate to ask us about a translation or the meaning of some text via Github Issues. + +Once the translation is complete, it's probably best to test them in Cura. Use your favourite software to convert the .po file to a .mo file (such as [GetText](https://www.gnu.org/software/gettext/)). Then put the .mo files in the `.../resources/i18n//LC_MESSAGES` folder in your Cura installation. Then find your Cura configuration file (next to the log as described above, except on Linux where it is located in `~/.config/cura`) and change the language preference to the name of the folder you just created. Then start Cura. If working correctly, your Cura should now be translated. + +To submit your translation, ideally you would make two pull requests where all `*.po` files are located in that same `` folder in the resources of both the Cura and Uranium repositories. Put `cura.po`, `fdmprinter.def.json.po` and `fdmextruder.def.json.po` in the Cura repository, and put `uranium.po` in the Uranium repository. Then submit the pull requests to Github. For people with less experience with Git, you can also e-mail the translations to the e-mail address listed at the top of the [cura.pot](https://github.com/Ultimaker/Cura/blob/master/resources/i18n/cura.pot) file as the `Report-Msgid-Bugs-To` entry and we'll make sure it gets checked and included. + +After the translation is submitted, the Cura maintainers will check for its completeness and check whether it is consistent. We will take special care to look for common mistakes, such as translating mark-up `` code and such. We are often not fluent in every language, so we expect the translator and the international users to make corrections where necessary. Of course, there will always be some mistakes in every translation. + +When the next Cura release comes around, some of the texts will have changed and some new texts will have been added. Around the time when the beta is released we will invoke a string freeze, meaning that no developer is allowed to make changes to the texts. Then we will update the translation template `.pot` files and ask all our translators to update their translations. If you are unable to update the translation in time for the actual release, we will remove the language from the drop-down menu in the Preferences window. The translation stays in Cura however, so that someone might pick it up again later and update it with the newest texts. Also, users who had previously selected the language can still continue Cura in their language but English text will appear among the original text. \ No newline at end of file From 834fd055b6461af9d2c2c68d8eb1f0b6afb264ab Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 19 Jul 2017 14:48:11 +0200 Subject: [PATCH 323/379] Fix conflict resolve strategies in project loading CURA-4053 When loading a project file: - Only check if the global stack exists to detect conflicts instead of checking the global stack and the extruder stacks. It can happen that the global stack exists while the extruder stacks not or the other way around. - Always assign a resolve strategy to container(s). There can be "None" strategies and those were not handled correctly. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 50 +++++++++++++-------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 7afdf74b2e..055384d168 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -129,6 +129,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container_list = [] material_container_list = [] + resolve_strategy_keys = ["machine", "material", "quality_changes"] + self._resolve_strategies = {k: None for k in resolve_strategy_keys} + containers_found_dict = {k: False for k in resolve_strategy_keys} + # # Read definition containers # @@ -176,8 +180,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): container_id = self._stripFileToId(material_container_file) materials = self._container_registry.findInstanceContainers(id=container_id) material_labels.append(self._getMaterialLabelFromSerialized(archive.open(material_container_file).read().decode("utf-8"))) - if materials and not materials[0].isReadOnly(): # Only non readonly materials can be in conflict - material_conflict = True + if materials: + containers_found_dict["material"] = True + if not materials[0].isReadOnly(): # Only non readonly materials can be in conflict + material_conflict = True Job.yieldThread() # Check if any quality_changes instance container is in conflict. @@ -205,6 +211,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Check if quality changes already exists. quality_changes = self._container_registry.findInstanceContainers(id = container_id) if quality_changes: + containers_found_dict["quality_changes"] = True # Check if there really is a conflict by comparing the values if quality_changes[0] != instance_container: quality_changes_conflict = True @@ -227,21 +234,24 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Load ContainerStack files and ExtruderStack files global_stack_file, extruder_stack_files = self._determineGlobalAndExtruderStackFiles( file_name, cura_file_names) - self._resolve_strategies = {"machine": None, "quality_changes": None, "material": None} machine_conflict = False - for container_stack_file in [global_stack_file] + extruder_stack_files: - container_id = self._stripFileToId(container_stack_file) - serialized = archive.open(container_stack_file).read().decode("utf-8") - if machine_name == "": - machine_name = self._getMachineNameFromSerializedStack(serialized) - stacks = self._container_registry.findContainerStacks(id = container_id) - if stacks: - # Check if there are any changes at all in any of the container stacks. - id_list = self._getContainerIdListFromSerialized(serialized) - for index, container_id in enumerate(id_list): - if stacks[0].getContainer(index).getId() != container_id: - machine_conflict = True - Job.yieldThread() + # Because there can be cases as follows: + # - the global stack exists but some/all of the extruder stacks DON'T exist + # - the global stack DOESN'T exist but some/all of the extruder stacks exist + # To simplify this, only check if the global stack exists or not + container_id = self._stripFileToId(global_stack_file) + serialized = archive.open(global_stack_file).read().decode("utf-8") + if machine_name == "": + machine_name = self._getMachineNameFromSerializedStack(serialized) + stacks = self._container_registry.findContainerStacks(id = container_id) + if stacks: + containers_found_dict["machine"] = True + # Check if there are any changes at all in any of the container stacks. + id_list = self._getContainerIdListFromSerialized(serialized) + for index, container_id in enumerate(id_list): + if stacks[0].getContainer(index).getId() != container_id: + machine_conflict = True + Job.yieldThread() num_visible_settings = 0 try: @@ -301,10 +311,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # - new: create a new container # - override: override the existing container # - None: There is no conflict, which means containers with the same IDs may or may not be there already. - # If they are there, there is no conflict between the them. - # In this case, you can either create a new one, or safely override the existing one. + # If there is an existing container, there is no conflict between the them, and default to "override" + # If there is no existing container, default to "new" # # Default values + for key, strategy in self._resolve_strategies.items(): + if key not in containers_found_dict or strategy is not None: + continue + self._resolve_strategies[key] = "override" if containers_found_dict[key] else "new" return WorkspaceReader.PreReadResult.accepted From 3474bb07382d5d50058469f2e24f95bc4e4bf8dc Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 19 Jul 2017 15:17:10 +0200 Subject: [PATCH 324/379] Fix project conflict resolving for global stack and extruder stacks CURA-4053 - Fix that if the resolve strategy is new for machine, Cura should always create new global and extruder stacks - Fix possible duplicated IDs when "Create New" machine is selected --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 142 ++++++++------------ 1 file changed, 54 insertions(+), 88 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 055384d168..0e4a021bcb 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -582,47 +582,43 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # -- # load global stack file try: - # Check if a stack by this ID already exists; - container_stacks = self._container_registry.findContainerStacks(id = global_stack_id_original) - if container_stacks: + if self._resolve_strategies["machine"] == "override": + container_stacks = self._container_registry.findContainerStacks(id = global_stack_id_original) stack = container_stacks[0] - if self._resolve_strategies["machine"] == "override": - # TODO: HACK - # There is a machine, check if it has authentication data. If so, keep that data. - network_authentication_id = container_stacks[0].getMetaDataEntry("network_authentication_id") - network_authentication_key = container_stacks[0].getMetaDataEntry("network_authentication_key") - container_stacks[0].deserialize(archive.open(global_stack_file).read().decode("utf-8")) - if network_authentication_id: - container_stacks[0].addMetaDataEntry("network_authentication_id", network_authentication_id) - if network_authentication_key: - container_stacks[0].addMetaDataEntry("network_authentication_key", network_authentication_key) - elif self._resolve_strategies["machine"] == "new": - stack = GlobalStack(global_stack_id_new) - stack.deserialize(archive.open(global_stack_file).read().decode("utf-8")) + # HACK + # There is a machine, check if it has authentication data. If so, keep that data. + network_authentication_id = container_stacks[0].getMetaDataEntry("network_authentication_id") + network_authentication_key = container_stacks[0].getMetaDataEntry("network_authentication_key") + container_stacks[0].deserialize(archive.open(global_stack_file).read().decode("utf-8")) + if network_authentication_id: + container_stacks[0].addMetaDataEntry("network_authentication_id", network_authentication_id) + if network_authentication_key: + container_stacks[0].addMetaDataEntry("network_authentication_key", network_authentication_key) - # Ensure a unique ID and name - stack._id = global_stack_id_new - - # Extruder stacks are "bound" to a machine. If we add the machine as a new one, the id of the - # bound machine also needs to change. - if stack.getMetaDataEntry("machine", None): - stack.setMetaDataEntry("machine", global_stack_id_new) - - # Only machines need a new name, stacks may be non-unique - stack.setName(self._container_registry.uniqueName(stack.getName())) - container_stacks_added.append(stack) - self._container_registry.addContainer(stack) - else: - Logger.log("w", "Resolve strategy of %s for machine is not supported", self._resolve_strategies["machine"]) - else: - # no existing container stack, so we create a new one + elif self._resolve_strategies["machine"] == "new": + # create a new global stack stack = GlobalStack(global_stack_id_new) # Deserialize stack by converting read data from bytes to string stack.deserialize(archive.open(global_stack_file).read().decode("utf-8")) + + # Ensure a unique ID and name + stack._id = global_stack_id_new + + # Extruder stacks are "bound" to a machine. If we add the machine as a new one, the id of the + # bound machine also needs to change. + if stack.getMetaDataEntry("machine", None): + stack.setMetaDataEntry("machine", global_stack_id_new) + + # Only machines need a new name, stacks may be non-unique + stack.setName(self._container_registry.uniqueName(stack.getName())) + container_stacks_added.append(stack) self._container_registry.addContainer(stack) containers_added.append(stack) + else: + Logger.log("e", "Resolve strategy of %s for machine is not supported", + self._resolve_strategies["machine"]) global_stack = stack Job.yieldThread() @@ -636,73 +632,43 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # -- # load extruder stack files try: - for index, extruder_stack_file in enumerate(extruder_stack_files): + for extruder_stack_file in extruder_stack_files: container_id = self._stripFileToId(extruder_stack_file) extruder_file_content = archive.open(extruder_stack_file, "r").read().decode("utf-8") - container_stacks = self._container_registry.findContainerStacks(id = container_id) - if container_stacks: - # this container stack already exists, try to resolve + if self._resolve_strategies["machine"] == "override": + container_stacks = self._container_registry.findContainerStacks(id = container_id) stack = container_stacks[0] - if self._resolve_strategies["machine"] == "override": - # NOTE: This is the same code as those in the lower part - # deserialize new extruder stack over the current ones - stack = self._overrideExtruderStack(global_stack, extruder_file_content) + # deserialize new extruder stack over the current ones + stack = self._overrideExtruderStack(global_stack, extruder_file_content) - elif self._resolve_strategies["machine"] == "new": - # create a new extruder stack from this one - new_id = extruder_stack_id_map[container_id] - stack = ExtruderStack(new_id) + elif self._resolve_strategies["machine"] == "new": + new_id = extruder_stack_id_map[container_id] + stack = ExtruderStack(new_id) - # HACK: the global stack can have a new name, so we need to make sure that this extruder stack - # references to the new name instead of the old one. Normally, this can be done after - # deserialize() by setting the metadata, but in the case of ExtruderStack, deserialize() - # also does addExtruder() to its machine stack, so we have to make sure that it's pointing - # to the right machine BEFORE deserialization. - extruder_config = configparser.ConfigParser() - extruder_config.read_string(extruder_file_content) - extruder_config.set("metadata", "machine", global_stack_id_new) - tmp_string_io = io.StringIO() - extruder_config.write(tmp_string_io) - extruder_file_content = tmp_string_io.getvalue() + # HACK: the global stack can have a new name, so we need to make sure that this extruder stack + # references to the new name instead of the old one. Normally, this can be done after + # deserialize() by setting the metadata, but in the case of ExtruderStack, deserialize() + # also does addExtruder() to its machine stack, so we have to make sure that it's pointing + # to the right machine BEFORE deserialization. + extruder_config = configparser.ConfigParser() + extruder_config.read_string(extruder_file_content) + extruder_config.set("metadata", "machine", global_stack_id_new) + tmp_string_io = io.StringIO() + extruder_config.write(tmp_string_io) + extruder_file_content = tmp_string_io.getvalue() - stack.deserialize(extruder_file_content) + stack.deserialize(extruder_file_content) - # Ensure a unique ID and name - stack._id = new_id + # Ensure a unique ID and name + stack._id = new_id - self._container_registry.addContainer(stack) - extruder_stacks_added.append(stack) - containers_added.append(stack) + self._container_registry.addContainer(stack) + extruder_stacks_added.append(stack) + containers_added.append(stack) else: - # No extruder stack with the same ID can be found - if self._resolve_strategies["machine"] == "override": - # deserialize new extruder stack over the current ones - stack = self._overrideExtruderStack(global_stack, extruder_file_content) - - elif self._resolve_strategies["machine"] == "new": - # container not found, create a new one - stack = ExtruderStack(container_id) - - # HACK: the global stack can have a new name, so we need to make sure that this extruder stack - # references to the new name instead of the old one. Normally, this can be done after - # deserialize() by setting the metadata, but in the case of ExtruderStack, deserialize() - # also does addExtruder() to its machine stack, so we have to make sure that it's pointing - # to the right machine BEFORE deserialization. - extruder_config = configparser.ConfigParser() - extruder_config.read_string(extruder_file_content) - extruder_config.set("metadata", "machine", global_stack_id_new) - tmp_string_io = io.StringIO() - extruder_config.write(tmp_string_io) - extruder_file_content = tmp_string_io.getvalue() - - stack.deserialize(extruder_file_content) - self._container_registry.addContainer(stack) - extruder_stacks_added.append(stack) - containers_added.append(stack) - else: - Logger.log("w", "Unknown resolve strategy: %s" % str(self._resolve_strategies["machine"])) + Logger.log("w", "Unknown resolve strategy: %s", self._resolve_strategies["machine"]) extruder_stacks.append(stack) except: From 7148c71877b427923071b76023843e3f6ec52930 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 19 Jul 2017 16:35:52 +0200 Subject: [PATCH 325/379] Change extruder stacks for conflicts only if the global stack is found CURA-4053 If the global stack is not found, we assume the machine is not there and default to create a new one. If the machine is found and there is not conflicts, then we check the extruders associated for conflicts. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 39 +++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 0e4a021bcb..6c9420e318 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -241,18 +241,51 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # To simplify this, only check if the global stack exists or not container_id = self._stripFileToId(global_stack_file) serialized = archive.open(global_stack_file).read().decode("utf-8") - if machine_name == "": - machine_name = self._getMachineNameFromSerializedStack(serialized) + machine_name = self._getMachineNameFromSerializedStack(serialized) stacks = self._container_registry.findContainerStacks(id = container_id) if stacks: + global_stack = stacks[0] containers_found_dict["machine"] = True # Check if there are any changes at all in any of the container stacks. id_list = self._getContainerIdListFromSerialized(serialized) for index, container_id in enumerate(id_list): - if stacks[0].getContainer(index).getId() != container_id: + if global_stack.getContainer(index).getId() != container_id: machine_conflict = True + break Job.yieldThread() + # if the global stack is found, we check if there are conflicts in the extruder stacks + if containers_found_dict["machine"] and not machine_conflict: + for extruder_stack_file in extruder_stack_files: + container_id = self._stripFileToId(extruder_stack_file) + serialized = archive.open(extruder_stack_file).read().decode("utf-8") + parser = configparser.ConfigParser() + parser.read_string(serialized) + + # The check should be done for the extruder stack that's associated with the existing global stack, + # and those extruder stacks may have different IDs. + # So we check according to the positions + + position = str(parser["metadata"]["position"]) + if position not in global_stack.extruders: + # The extruder position defined in the project doesn't exist in this global stack. + # We can say that it is a machine conflict, but it is very hard to override the machine in this + # case because we need to override the existing extruders and add the non-existing extruders. + # + # HACK: + # To make this simple, we simply say that there is no machine conflict and create a new machine + # by default. + machine_conflict = False + break + + existing_extruder_stack = global_stack.extruders[position] + # check if there are any changes at all in any of the container stacks. + id_list = self._getContainerIdListFromSerialized(serialized) + for index, container_id in enumerate(id_list): + if existing_extruder_stack.getContainer(index).getId() != container_id: + machine_conflict = True + break + num_visible_settings = 0 try: temp_preferences = Preferences() From 9288f408e565ed20af6563565ea7f22168d94a7a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 19 Jul 2017 16:39:02 +0200 Subject: [PATCH 326/379] Correctly detect old project files for conflicts CURA-4053 - In Cura 2.5, there is no definition_changes in the stack. This is now taken into account when doing conflicts detection. - In Cura 2.5, we have empty containers named as "empty_variant" and such. Those are now properly handled in conflict detection. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 6c9420e318..c717937db2 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -56,6 +56,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._id_mapping = {} + # In Cura 2.5 and 2.6, the empty profiles used to have those long names + self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]} + ## Get a unique name based on the old_id. This is different from directly calling the registry in that it caches results. # This has nothing to do with speed, but with getting consistent new naming for instances & objects. def getNewId(self, old_id): @@ -249,6 +252,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Check if there are any changes at all in any of the container stacks. id_list = self._getContainerIdListFromSerialized(serialized) for index, container_id in enumerate(id_list): + # take into account the old empty container IDs + container_id = self._old_empty_profile_id_dict.get(container_id, container_id) + # HACK: there used to be 5, now we have one more 5 - definition changes + if len(id_list) == 6 and index == 5: + index = 6 if global_stack.getContainer(index).getId() != container_id: machine_conflict = True break @@ -282,6 +290,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # check if there are any changes at all in any of the container stacks. id_list = self._getContainerIdListFromSerialized(serialized) for index, container_id in enumerate(id_list): + # take into account the old empty container IDs + container_id = self._old_empty_profile_id_dict.get(container_id, container_id) + # HACK: there used to be 5, now we have one more 5 - definition changes + if len(id_list) == 6 and index == 5: + index = 6 if existing_extruder_stack.getContainer(index).getId() != container_id: machine_conflict = True break From 356b3cf0ca2ad131290c12a4c17b10493e18786f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 19 Jul 2017 16:44:02 +0200 Subject: [PATCH 327/379] Remove unnecessary code CURA-4053 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index c717937db2..eb45b9ef3d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -683,9 +683,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_file_content = archive.open(extruder_stack_file, "r").read().decode("utf-8") if self._resolve_strategies["machine"] == "override": - container_stacks = self._container_registry.findContainerStacks(id = container_id) - stack = container_stacks[0] - # deserialize new extruder stack over the current ones stack = self._overrideExtruderStack(global_stack, extruder_file_content) From 007b529f00c3436b3aa7b35772c84807c454ae4f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 20 Jul 2017 09:00:14 +0200 Subject: [PATCH 328/379] Make capitalisation use more consistent At least with the Polish translation itself. Contributes to issue CURA-3998. --- resources/i18n/pl/fdmprinter.def.json.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index 1c47516457..f665b89b68 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -4303,11 +4303,11 @@ msgstr "Dolny/Górny Wzór" msgctxt "top_bottom_pattern option concentric" msgid "Concentric" -msgstr "koncentryczny" +msgstr "Koncentryczny" msgctxt "top_bottom_pattern option lines" msgid "Lines" -msgstr "liniowy" +msgstr "Liniowy" msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" From d4824a8ff19d5cadbd9ad7e5765e0b5c65bb372f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 20 Jul 2017 09:43:31 +0200 Subject: [PATCH 329/379] Make time estimates tooltip also appear on clock icon Perhaps that reduces the complaints we have about that thing not appearing. --- resources/qml/JobSpecs.qml | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 13d855d993..fa0ca087b7 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -157,19 +157,6 @@ Item { width: parent.width height: parent.height - UM.RecolorImage - { - id: timeIcon - anchors.right: timeSpecPerFeatureTooltipArea.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width/2 - anchors.verticalCenter: parent.verticalCenter - width: UM.Theme.getSize("save_button_specs_icons").width - height: UM.Theme.getSize("save_button_specs_icons").height - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text_subtext") - source: UM.Theme.getIcon("print_time") - } UM.TooltipArea { id: timeSpecPerFeatureTooltipArea @@ -205,10 +192,25 @@ Item { anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter + UM.RecolorImage + { + id: timeIcon + anchors.left: parent.left + anchors.top: parent.top + anchors.verticalCenter: parent.verticalCenter + width: UM.Theme.getSize("save_button_specs_icons").width + height: UM.Theme.getSize("save_button_specs_icons").height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text_subtext") + source: UM.Theme.getIcon("print_time") + } + Text { id: timeSpec - anchors.left: parent.left + anchors.left: timeIcon.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2 anchors.top: parent.top font: UM.Theme.getFont("small") color: UM.Theme.getColor("text_subtext") From 22c1a118a869adb2f7c0939e7cce54820cde5f3d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 20 Jul 2017 10:28:07 +0200 Subject: [PATCH 330/379] Fix conflict detection when there is no definition_changes CURA-4053 An old project file doesn't have the definition_changes container in the stacks. When this is the case, Cura should also check if the definition changes container in an existing stack is empty or not for project file loading conflict detection. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index eb45b9ef3d..aca3948813 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -256,6 +256,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): container_id = self._old_empty_profile_id_dict.get(container_id, container_id) # HACK: there used to be 5, now we have one more 5 - definition changes if len(id_list) == 6 and index == 5: + if global_stack.getContainer(5).getId() != "empty": + machine_conflict = True + break index = 6 if global_stack.getContainer(index).getId() != container_id: machine_conflict = True @@ -294,6 +297,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): container_id = self._old_empty_profile_id_dict.get(container_id, container_id) # HACK: there used to be 5, now we have one more 5 - definition changes if len(id_list) == 6 and index == 5: + if existing_extruder_stack.getContainer(5).getId() != "empty": + machine_conflict = True + break index = 6 if existing_extruder_stack.getContainer(index).getId() != container_id: machine_conflict = True From 216b1a7a14c1cfd093b9af28a4bf4473ead1232b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 20 Jul 2017 11:39:12 +0200 Subject: [PATCH 331/379] Added control item to printOutputDevice CURA-4057 --- cura/PrinterOutputDevice.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index e23efc0f5a..60df3c3f6e 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -65,6 +65,11 @@ class PrinterOutputDevice(QObject, OutputDevice): self._monitor_view_qml_path = "" self._monitor_component = None self._monitor_item = None + + self._control_view_qml_path = "" + self._control_component = None + self._control_item = None + self._qml_context = None def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): @@ -131,6 +136,29 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._monitor_item + @pyqtProperty(QObject, constant=True) + def controlItem(self): + if not self._control_component: + self._createControlViewFromQML() + + return self._control_item + + def _createControlViewFromQML(self): + path = QUrl.fromLocalFile(self._monitor_view_qml_path) + + # Because of garbage collection we need to keep this referenced by python. + self._control_component = QQmlComponent(Application.getInstance()._engine, path) + + # Check if the context was already requested before (Printer output device might have multiple items in the future) + if self._qml_context is None: + self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._qml_context.setContextProperty("OutputDevice", self) + + self._control_item = self._control_component.create(self._qml_context) + if self._control_item is None: + Logger.log("e", "QQmlComponent status %s", self._control_component.status()) + Logger.log("e", "QQmlComponent error string %s", self._control_component.errorString()) + def _createMonitorViewFromQML(self): path = QUrl.fromLocalFile(self._monitor_view_qml_path) From b839cb74f4f02586649aa38bb2b3063cb3216e51 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Jul 2017 12:01:21 +0200 Subject: [PATCH 332/379] Do not only check if activeMaterialId is None, also check for empty Fixes CURA-4065 --- cura/Settings/CuraContainerRegistry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index ed63e10909..52760d7782 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -282,7 +282,7 @@ class CuraContainerRegistry(ContainerRegistry): profile.setDefinition(self._activeQualityDefinition()) if self._machineHasOwnMaterials(): active_material_id = self._activeMaterialId() - if active_material_id: # only update if there is an active material + if active_material_id and active_material_id != "empty": # only update if there is an active material profile.addMetaDataEntry("material", active_material_id) quality_type_criteria["material"] = active_material_id From 6e55bf2d8fb6117a86ef0037b0ddb505f161b04a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 20 Jul 2017 13:30:57 +0200 Subject: [PATCH 333/379] If output device has a contorl item, that one is used. If a printerOutput device does not define anything, the fallback is used. CURA-4057 --- cura/PrinterOutputDevice.py | 2 +- .../NetworkPrinterOutputDevice.py | 1 - resources/qml/Sidebar.qml | 41 ++++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 60df3c3f6e..bf013e4b9f 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -144,7 +144,7 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._control_item def _createControlViewFromQML(self): - path = QUrl.fromLocalFile(self._monitor_view_qml_path) + path = QUrl.fromLocalFile(self._control_view_qml_path) # Because of garbage collection we need to keep this referenced by python. self._control_component = QQmlComponent(Application.getInstance()._engine, path) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index b309691e81..03636fd0b0 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -179,7 +179,6 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): self._compressing_print = False self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "MonitorItem.qml") - printer_type = self._properties.get(b"machine", b"").decode("utf-8") if printer_type.startswith("9511"): self._updatePrinterType("ultimaker3_extended") diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index b57b56c292..db5f60862d 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -20,6 +20,7 @@ Rectangle // Is there an output device for this printer? property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null property int backendState: UM.Backend.state; property bool monitoringPrint: false @@ -344,12 +345,48 @@ Rectangle Loader { + id: controlItem anchors.bottom: footerSeparator.top anchors.top: headerSeparator.bottom anchors.left: base.left anchors.right: base.right - source: monitoringPrint ? "PrintMonitor.qml": "SidebarContents.qml" - } + sourceComponent: + { + if(monitoringPrint && connectedPrinter != null) + { + if(connectedPrinter.controlItem != null) + { + return connectedPrinter.controlItem + } + } + return null + } + } + + Loader + { + anchors.bottom: footerSeparator.top + anchors.top: headerSeparator.bottom + anchors.left: base.left + anchors.right: base.right + source: + { + if(controlItem.sourceComponent == null) + { + if(monitoringPrint) + { + return "PrintMonitor.qml" + } else + { + return "SidebarContents.qml" + } + } + else + { + return "" + } + } + } Rectangle { From 121fc170647ae2fe01dae42bfe41a3c30ebee034 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 20 Jul 2017 15:15:03 +0200 Subject: [PATCH 334/379] Multiply objects dialog is now application modal CURA-3768 --- resources/qml/Menus/ContextMenu.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 915d320f41..86e146cb17 100755 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -78,6 +78,7 @@ Menu Dialog { id: multiplyDialog + modality: Qt.ApplicationModal title: catalog.i18ncp("@title:window", "Multiply Selected Model", "Multiply Selected Models", UM.Selection.selectionCount) From 4d0c46508aa0e2ec76459c597ea5c059b10a6c56 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 20 Jul 2017 15:17:46 +0200 Subject: [PATCH 335/379] Fixed incorrect naming of printcores in error messages CURA-3734 --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index b309691e81..5a7fb3a409 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -645,7 +645,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): # Only check for mistakes if there is material length information. if print_information.materialLengths: - # Check if print cores / materials are loaded at all. Any failure in these results in an Error. + # Check if PrintCores / materials are loaded at all. Any failure in these results in an Error. for index in range(0, self._num_extruders): if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: if self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] == "": @@ -677,7 +677,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): if variant: if variant.getName() != core_name: Logger.log("w", "Extruder %s has a different Cartridge (%s) as Cura (%s)", index + 1, core_name, variant.getName()) - warnings.append(i18n_catalog.i18nc("@label", "Different print core (Cura: {0}, Printer: {1}) selected for extruder {2}".format(variant.getName(), core_name, index + 1))) + warnings.append(i18n_catalog.i18nc("@label", "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}".format(variant.getName(), core_name, index + 1))) material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"}) if material: @@ -699,7 +699,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): is_offset_calibrated = True if not is_offset_calibrated: - warnings.append(i18n_catalog.i18nc("@label", "Print core {0} is not properly calibrated. XY calibration needs to be performed on the printer.").format(index + 1)) + warnings.append(i18n_catalog.i18nc("@label", "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer.").format(index + 1)) else: Logger.log("w", "There was no material usage found. No check to match used material with machine is done.") @@ -1176,7 +1176,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): i18n_catalog.i18nc("@label", "Would you like to use your current printer configuration in Cura?"), i18n_catalog.i18nc("@label", - "The print cores and/or materials on your printer differ from those within your current project. For the best result, always slice for the print cores and materials that are inserted in your printer."), + "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."), buttons=QMessageBox.Yes + QMessageBox.No, icon=QMessageBox.Question, callback=callback From d5be43d45ddf2f6a986e9399dd64bf522c8aabe4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 20 Jul 2017 15:42:04 +0200 Subject: [PATCH 336/379] roofing: inherit from topbottom (CURA-3940) --- resources/definitions/fdmprinter.def.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 27fd838aa6..6f46d62c66 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -709,7 +709,7 @@ "maximum_value_warning": "2 * machine_nozzle_size", "default_value": 0.4, "type": "float", - "value": "line_width", + "value": "skin_line_width", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, "enabled": "roofing_layer_count > 0 and top_layers > 0" @@ -952,6 +952,7 @@ "description": "The extruder train used for printing the top most skin. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", + "value": "top_bottom_extruder_nr", "settable_per_mesh": true, "settable_per_extruder": false, "settable_per_meshgroup": true, @@ -983,6 +984,7 @@ "zigzag": "Zig Zag" }, "default_value": "lines", + "value": "top_bottom_pattern", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, "enabled": "roofing_layer_count > 0 and top_layers > 0" @@ -993,6 +995,7 @@ "description": "A list of integer line directions to use when the roofing layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", "type": "[int]", "default_value": "[ ]", + "value": "skin_angles", "enabled": "roofing_pattern != 'concentric'", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true @@ -2083,7 +2086,7 @@ "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", "default_value": 25, - "value": "speed_print / 60 * 25", + "value": "speed_topbottom", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, "enabled": "roofing_layer_count > 0 and top_layers > 0" @@ -2438,7 +2441,7 @@ "minimum_value_warning": "100", "maximum_value_warning": "10000", "default_value": 3000, - "value": "acceleration_print", + "value": "acceleration_topbottom", "enabled": "resolveOrValue('acceleration_enabled') and roofing_layer_count > 0 and top_layers > 0", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true @@ -2741,7 +2744,7 @@ "minimum_value": "0.1", "maximum_value_warning": "50", "default_value": 20, - "value": "jerk_print", + "value": "jerk_topbottom", "enabled": "resolveOrValue('jerk_enabled') and roofing_layer_count > 0 and top_layers > 0", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true From 326c4cc4a420883fdf971193bb5acd94f01f4f7f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Jul 2017 10:15:20 +0200 Subject: [PATCH 337/379] Removed code duplication CURA-4053 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index aca3948813..56b8c62d28 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -254,12 +254,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for index, container_id in enumerate(id_list): # take into account the old empty container IDs container_id = self._old_empty_profile_id_dict.get(container_id, container_id) - # HACK: there used to be 5, now we have one more 5 - definition changes - if len(id_list) == 6 and index == 5: - if global_stack.getContainer(5).getId() != "empty": - machine_conflict = True - break - index = 6 if global_stack.getContainer(index).getId() != container_id: machine_conflict = True break @@ -295,12 +289,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for index, container_id in enumerate(id_list): # take into account the old empty container IDs container_id = self._old_empty_profile_id_dict.get(container_id, container_id) - # HACK: there used to be 5, now we have one more 5 - definition changes - if len(id_list) == 6 and index == 5: - if existing_extruder_stack.getContainer(5).getId() != "empty": - machine_conflict = True - break - index = 6 if existing_extruder_stack.getContainer(index).getId() != container_id: machine_conflict = True break @@ -875,6 +863,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): container_list = container_string.split(",") container_ids = [container_id for container_id in container_list if container_id != ""] + if len(container_ids) == 5: + # Hack; We used to not save the definition changes. Fix this. + container_ids.insert(4, "empty") + return container_ids def _getMachineNameFromSerializedStack(self, serialized): From 141cfe776e60057959a53b7424ad8aceeae782e3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 11:28:44 +0200 Subject: [PATCH 338/379] Fix handling old stack without definition_changes and add doc CURA-4053 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 56b8c62d28..1a7a06d8b6 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -863,9 +863,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): container_list = container_string.split(",") container_ids = [container_id for container_id in container_list if container_id != ""] - if len(container_ids) == 5: + # HACK: there used to be 6 containers numbering from 0 to 5 in a stack, + # now we have 7: index 5 becomes "definition_changes" + if len(container_ids) == 6: # Hack; We used to not save the definition changes. Fix this. - container_ids.insert(4, "empty") + container_ids.insert(5, "empty") return container_ids From 15a6b5626dc3a8771aab39d5fa56ff9271a19896 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 11:32:09 +0200 Subject: [PATCH 339/379] Remove useless code CURA-4053 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 1a7a06d8b6..e40a7c5479 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -881,5 +881,3 @@ class ThreeMFWorkspaceReader(WorkspaceReader): metadata = data.iterfind("./um:metadata/um:name/um:label", {"um": "http://www.ultimaker.com/material"}) for entry in metadata: return entry.text - pass - From ed91bf816f34f3b146d7788ca90a7d6e89704a61 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 11:36:45 +0200 Subject: [PATCH 340/379] Correct definition_changes location in 2.6 to 2.7 upgrade script CURA-4053 --- plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py index b0c0d70ae2..c309142c8f 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py @@ -53,7 +53,7 @@ def getMetaData(): }, "definition_changes": { "get_version": upgrade.getCfgVersion, - "location": {"./machine_instances"} + "location": {"./definition_changes"} } } } From 66c97259c258813a11d7bb3483d1b76590fbead2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 21 Jul 2017 11:14:17 +0200 Subject: [PATCH 341/379] Make prime tower automatic formula the default for all FDM printers The Custom FDM Printer had wrong positions by default as well. --- resources/definitions/cartesio.def.json | 4 ++-- resources/definitions/fdmprinter.def.json | 2 ++ resources/definitions/makeit_pro_l.def.json | 4 ++-- resources/definitions/makeit_pro_m.def.json | 4 ++-- resources/definitions/ultimaker3.def.json | 3 +-- resources/definitions/ultimaker_original_dual.def.json | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index bbc62bdf75..e5253f3b75 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -48,8 +48,8 @@ "material_bed_temp_wait": { "default_value": false }, "prime_tower_enable": { "default_value": true }, "prime_tower_wall_thickness": { "resolve": 0.7 }, - "prime_tower_position_x": { "default_value": 50 }, - "prime_tower_position_y": { "default_value": 150 }, + "prime_tower_position_x": { "value": "50" }, + "prime_tower_position_y": { "value": "150" }, "prime_blob_enable": { "default_value": false }, "machine_max_feedrate_z": { "default_value": 20 }, "machine_disallowed_areas": { "default_value": [ diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4186a74a74..225ae76080 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4462,6 +4462,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' 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')) - 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, @@ -4475,6 +4476,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' 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')) - 1", "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, diff --git a/resources/definitions/makeit_pro_l.def.json b/resources/definitions/makeit_pro_l.def.json index 79dab33fc1..32f65d2b99 100644 --- a/resources/definitions/makeit_pro_l.def.json +++ b/resources/definitions/makeit_pro_l.def.json @@ -72,10 +72,10 @@ "enabled": true }, "prime_tower_position_x": { - "default_value": 185 + "value": "185" }, "prime_tower_position_y": { - "default_value": 160 + "value": "160" }, "material_diameter": { "default_value": 1.75 diff --git a/resources/definitions/makeit_pro_m.def.json b/resources/definitions/makeit_pro_m.def.json index 0d9dab7073..7cae1d12ae 100644 --- a/resources/definitions/makeit_pro_m.def.json +++ b/resources/definitions/makeit_pro_m.def.json @@ -72,10 +72,10 @@ "enabled": false }, "prime_tower_position_x": { - "default_value": 185 + "value": "185" }, "prime_tower_position_y": { - "default_value": 160 + "value": "160" }, "material_diameter": { "default_value": 1.75 diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 1cbd1fa363..06f0fe3a89 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -69,8 +69,7 @@ "extruder_prime_pos_abs": { "default_value": true }, "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, - "prime_tower_position_x": { "default_value": 170 }, - "prime_tower_position_y": { "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' 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')) - 1" }, + "prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' 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')) - 30" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index d133a3853f..e219a5ecb5 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -73,10 +73,10 @@ "default_value": 2 }, "prime_tower_position_x": { - "default_value": 195 + "value": "195" }, "prime_tower_position_y": { - "default_value": 149 + "value": "149" } } } From 4bb95eee36ccfd83c28ec9bb474d6d0b556cfbcc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 21 Jul 2017 11:15:43 +0200 Subject: [PATCH 342/379] Apply initial layer line width to skirt lines in prime tower position calculation --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 225ae76080..47cb24b1f8 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4462,7 +4462,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' 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')) - 1", + "value": "machine_width - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' 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 - 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, @@ -4476,7 +4476,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' 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')) - 1", + "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' 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 - 1", "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 75af56b1a1ba18d408886a8830d48fe63c804541 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 21 Jul 2017 12:56:15 +0200 Subject: [PATCH 343/379] Only use line widths of used extruders for brim/skirt size No lines are drawn for the rest of the extruders. Contributes to issue CURA-4072. --- cura/BuildVolume.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e65756f181..cf75d75d5e 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -904,6 +904,7 @@ class BuildVolume(SceneNode): if not self._global_container_stack: return 0 container_stack = self._global_container_stack + used_extruders = ExtruderManager.getInstance().getUsedExtruderStacks() # If we are printing one at a time, we need to add the bed adhesion size to the disallowed areas of the objects if container_stack.getProperty("print_sequence", "value") == "one_at_a_time": @@ -914,24 +915,18 @@ class BuildVolume(SceneNode): skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap") skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count") bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingFromAdhesionExtruder("skirt_brim_line_width")) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 - if len(ExtruderManager.getInstance().getUsedExtruderStacks()) > 1: - adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")) - extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width") - line_width_factors = ExtruderManager.getInstance().getAllExtruderValues("initial_layer_line_width_factor") - del extruder_values[adhesion_extruder_nr] # Remove the value of the adhesion extruder nr. - del line_width_factors[adhesion_extruder_nr] - for i in range(min(len(extruder_values), len(line_width_factors))): - bed_adhesion_size += extruder_values[i] * line_width_factors[i] / 100.0 + if len(used_extruders) > 1: + 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 -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 elif adhesion_type == "brim": bed_adhesion_size = self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")) - extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width") - line_width_factors = ExtruderManager.getInstance().getAllExtruderValues("initial_layer_line_width_factor") - del extruder_values[adhesion_extruder_nr] # Remove the value of the adhesion extruder nr. - del line_width_factors[adhesion_extruder_nr] - for i in range(min(len(extruder_values), len(line_width_factors))): - bed_adhesion_size += extruder_values[i] * line_width_factors[i] / 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 brim with. + bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 elif adhesion_type == "raft": bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin") elif adhesion_type == "none": @@ -951,7 +946,6 @@ class BuildVolume(SceneNode): move_from_wall_radius = 0 # Moves that start from outer wall. move_from_wall_radius = max(move_from_wall_radius, max(self._getSettingFromAllExtruders("infill_wipe_dist"))) - used_extruders = ExtruderManager.getInstance().getUsedExtruderStacks() avoid_enabled_per_extruder = [stack.getProperty("travel_avoid_other_parts","value") for stack in used_extruders] travel_avoid_distance_per_extruder = [stack.getProperty("travel_avoid_distance", "value") for stack in used_extruders] for avoid_other_parts_enabled, avoid_distance in zip(avoid_enabled_per_extruder, travel_avoid_distance_per_extruder): #For each extruder (or just global). From 9a92b58ac3ba481bd45e1d71aa57df5d4d48541a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 13:26:46 +0200 Subject: [PATCH 344/379] Check all limit_to_extruder features in getUsedExtruderStacks() CURA-4069 getUsedExtruderStacks() doesn't take into account some new limit to extruder features, The BuildVolume uses it to determine disallowed areas, and this makes it give incorrect results. --- cura/Settings/ExtruderManager.py | 48 ++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 70f95caae5..322d61fa3b 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -426,6 +426,7 @@ class ExtruderManager(QObject): support_enabled = False support_bottom_enabled = False support_roof_enabled = False + support_interface_enable = False scene_root = Application.getInstance().getController().getScene().getRoot() meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed. for mesh in meshes: @@ -434,19 +435,40 @@ class ExtruderManager(QObject): extruder_stack_id = self.extruderIds["0"] used_extruder_stack_ids.add(extruder_stack_id) - #Get whether any of them use support. - per_mesh_stack = mesh.callDecoration("getStack") - if per_mesh_stack: - support_enabled |= per_mesh_stack.getProperty("support_enable", "value") - support_bottom_enabled |= per_mesh_stack.getProperty("support_bottom_enable", "value") - support_roof_enabled |= per_mesh_stack.getProperty("support_roof_enable", "value") - else: #Take the setting from the build extruder stack. - extruder_stack = container_registry.findContainerStacks(id = extruder_stack_id)[0] - support_enabled |= extruder_stack.getProperty("support_enable", "value") - support_bottom_enabled |= extruder_stack.getProperty("support_bottom_enable", "value") - support_roof_enabled |= extruder_stack.getProperty("support_roof_enable", "value") + # Get whether any of them use support. + stack_to_use = mesh.callDecoration("getStack") # if there is a per-mesh stack, we use it + if not stack_to_use: + # if there is no per-mesh stack, we use the build extruder for this mesh + stack_to_use = container_registry.findContainerStacks(id = extruder_stack_id)[0] - #The support extruders. + support_enabled |= stack_to_use.getProperty("support_enable", "value") + support_bottom_enabled |= stack_to_use.getProperty("support_bottom_enable", "value") + support_roof_enabled |= stack_to_use.getProperty("support_roof_enable", "value") + support_interface_enable |= stack_to_use.getProperty("support_interface_enable", "value") + + # Check limit to extruders + limit_to_extruder_feature_list = ["wall_extruder_nr", + "wall_0_extruder_nr", + "wall_x_extruder_nr", + "top_bottom_extruder_nr", + "infill_extruder_nr", + ] + wall_extruder_nr = None + for extruder_nr_feature_name in limit_to_extruder_feature_list: + extruder_nr = global_stack.getProperty(extruder_nr_feature_name, "value") + if extruder_nr == -1: + # outer and inner wall extruder numbers should first inherit from the wall extruder number + if extruder_nr_feature_name in ["wall_0_extruder_nr", "wall_x_extruder_nr"]: + extruder_nr = wall_extruder_nr + else: + extruder_nr = 0 + + used_extruder_stack_ids.add(self.extruderIds[str(extruder_nr)]) + + if extruder_nr_feature_name == "wall_extruder_nr": + wall_extruder_nr = extruder_nr + + # Check support extruders if support_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_infill_extruder_nr", "value"))]) used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_extruder_nr_layer_0", "value"))]) @@ -454,6 +476,8 @@ class ExtruderManager(QObject): used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_bottom_extruder_nr", "value"))]) if support_roof_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) + if support_interface_enable: + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_interface_enable", "value"))]) #The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": From 1b0268f09c9648d01dca59ed650e55ac4e45a833 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 13:32:44 +0200 Subject: [PATCH 345/379] Use extruder_nr as integers for comparison CURA-4069 --- cura/Settings/ExtruderManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 322d61fa3b..487c7f8f7a 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -455,7 +455,7 @@ class ExtruderManager(QObject): ] wall_extruder_nr = None for extruder_nr_feature_name in limit_to_extruder_feature_list: - extruder_nr = global_stack.getProperty(extruder_nr_feature_name, "value") + extruder_nr = int(global_stack.getProperty(extruder_nr_feature_name, "value")) if extruder_nr == -1: # outer and inner wall extruder numbers should first inherit from the wall extruder number if extruder_nr_feature_name in ["wall_0_extruder_nr", "wall_x_extruder_nr"]: From b0be9010793298f77aec1b86e5b81003bbd03b7a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 13:40:13 +0200 Subject: [PATCH 346/379] Do not check support_interface_extruder_nr if it is used CURA-4069 support_bottom_extruder_nr and support_roof_extruder_nr are the support interface extruder numbers, so checking those two is enough and there is no need to check the interface extruder number. --- cura/Settings/ExtruderManager.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 487c7f8f7a..e490d94c16 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -426,7 +426,6 @@ class ExtruderManager(QObject): support_enabled = False support_bottom_enabled = False support_roof_enabled = False - support_interface_enable = False scene_root = Application.getInstance().getController().getScene().getRoot() meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed. for mesh in meshes: @@ -444,7 +443,6 @@ class ExtruderManager(QObject): support_enabled |= stack_to_use.getProperty("support_enable", "value") support_bottom_enabled |= stack_to_use.getProperty("support_bottom_enable", "value") support_roof_enabled |= stack_to_use.getProperty("support_roof_enable", "value") - support_interface_enable |= stack_to_use.getProperty("support_interface_enable", "value") # Check limit to extruders limit_to_extruder_feature_list = ["wall_extruder_nr", @@ -476,8 +474,6 @@ class ExtruderManager(QObject): used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_bottom_extruder_nr", "value"))]) if support_roof_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) - if support_interface_enable: - used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_interface_enable", "value"))]) #The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": From d7f3553c90e2e16587d51390821f611d39628968 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 14:39:43 +0200 Subject: [PATCH 347/379] Brim Line Count should take into account the initial layer line width factor CURA-4027 --- 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 47cb24b1f8..9f014616c5 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3911,7 +3911,7 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", - "value": "math.ceil(brim_width / 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'", "settable_per_mesh": false, "settable_per_extruder": true, From 5f97d2cbde1d7fa6d99263a97e9bdb27f0c3384e Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 21 Jul 2017 15:53:05 +0200 Subject: [PATCH 348/379] fix: account for roofing extruder when checking which extruder is used (CURA-4069, CURA-3940) --- cura/Settings/ExtruderManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index e490d94c16..1c254f5cfc 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -448,6 +448,7 @@ class ExtruderManager(QObject): limit_to_extruder_feature_list = ["wall_extruder_nr", "wall_0_extruder_nr", "wall_x_extruder_nr", + "roofing_extruder_nr", "top_bottom_extruder_nr", "infill_extruder_nr", ] From 3aabbab11f4b30b8696768fd8dcfbfb8f7fb2003 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 21 Jul 2017 16:03:09 +0200 Subject: [PATCH 349/379] Correctly handle IndexError for defaultColors CURA-4072 defaultColors is a list, so it's not KeyError but IndexError. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index c5d7515e98..1fe537622f 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -177,7 +177,7 @@ class ProcessSlicedLayersJob(Job): position = int(extruder.getMetaDataEntry("position", default="0")) # Get the position try: default_color = ExtrudersModel.defaultColors[position] - except KeyError: + except IndexError: default_color = "#e0e000" color_code = extruder.material.getMetaDataEntry("color_code", default=default_color) color = colorCodeToRGBA(color_code) From 3af089cfa01bacb33245441406edff71c1625014 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Sun, 2 Jul 2017 17:20:31 +0200 Subject: [PATCH 350/379] feat: Skin Reference wall settings (CURA-3990) --- resources/definitions/fdmprinter.def.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 9f014616c5..5cf0282f26 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1020,6 +1020,29 @@ } } }, + "top_reference_wall": + { + "label": "Top Reference Wall", + "description": "The number of the wall of the layers above a layer to consider as infill for that layer. Reducing this number reduces the skin on slanted top faces of the input model. Increasing this number causes walls on consecutive layers to be supported better.", + "minimum_value": "0", + "maximum_value": "wall_line_count", + "default_value": 2, + "type": "int", + "value": "wall_line_count", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "bottom_reference_wall": + { + "label": "Bottom Reference Wall", + "description": "The number of the wall of the layers below a layer to consider as infill for that layer. Reducing this number reduces the skin on overhanging faces of the input model.", + "minimum_value": "0", + "maximum_value": "wall_line_count", + "default_value": 0, + "type": "int", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, "top_bottom_pattern": { "label": "Top/Bottom Pattern", From cbc3daf535e8bf4e1fb0e98376fdff4e8352008a Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Sun, 2 Jul 2017 17:29:36 +0200 Subject: [PATCH 351/379] better description skin reference wall settings (CURA-3990) --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 5cf0282f26..cb358b5b6b 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1023,7 +1023,7 @@ "top_reference_wall": { "label": "Top Reference Wall", - "description": "The number of the wall of the layers above a layer to consider as infill for that layer. Reducing this number reduces the skin on slanted top faces of the input model. Increasing this number causes walls on consecutive layers to be supported better.", + "description": "The number of the wall of the layers above a layer to consider as infill for that layer. Reducing this number reduces the skin on slanted top faces of the input model. Increasing this number causes walls on consecutive layers to be supported better. Zero means the outline of the layer is used.", "minimum_value": "0", "maximum_value": "wall_line_count", "default_value": 2, @@ -1035,7 +1035,7 @@ "bottom_reference_wall": { "label": "Bottom Reference Wall", - "description": "The number of the wall of the layers below a layer to consider as infill for that layer. Reducing this number reduces the skin on overhanging faces of the input model.", + "description": "The number of the wall of the layers below a layer to consider as infill for that layer. Reducing this number reduces the skin on overhanging faces of the input model. Increasing this number causes bridges to attach better to the walls of the previous layer. Zero means the outline of the layer is used.", "minimum_value": "0", "maximum_value": "wall_line_count", "default_value": 0, From 06caedbed8a0ac66b3cf5dec12610bbf3e8b2657 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 24 Jul 2017 09:08:49 +0200 Subject: [PATCH 352/379] Update PVA profiles with gradual infill settings These profiles are optimised by hand. --- resources/definitions/fdmprinter.def.json | 2 +- .../quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg | 3 +-- .../quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg | 3 +-- .../ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg | 4 +--- .../quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg | 2 +- .../ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg | 1 + .../ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg | 2 ++ resources/variants/ultimaker3_bb0.8.inst.cfg | 7 +++++-- resources/variants/ultimaker3_bb04.inst.cfg | 5 ++++- 10 files changed, 18 insertions(+), 13 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 9f014616c5..5c7c246f58 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3472,7 +3472,7 @@ "description": "The height of support infill of a given density before switching to half the density.", "unit": "mm", "type": "float", - "default_value": 1.5, + "default_value": 1, "minimum_value": "0.0001", "minimum_value_warning": "3 * resolveOrValue('layer_height')", "enabled": "support_enable and support_infill_rate > 0 and gradual_support_infill_steps > 0", diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg index 7b042d9375..4c0c97c3d3 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg @@ -14,5 +14,4 @@ setting_version = 2 material_print_temperature = =default_material_print_temperature + 10 material_standby_temperature = 100 prime_tower_enable = False -skin_overlap = 20 -support_interface_height = 0.8 +skin_overlap = 20 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg index 0f78ea0860..65f06d51ac 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg @@ -15,4 +15,4 @@ material_print_temperature = =default_material_print_temperature + 5 material_standby_temperature = 100 prime_tower_enable = False skin_overlap = 15 -support_interface_height = 0.8 +support_infill_sparse_thickness = 0.3 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg index 7e335a01ae..154371470d 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg @@ -13,5 +13,4 @@ setting_version = 2 [values] material_standby_temperature = 100 prime_tower_enable = False -support_infill_rate = 25 -support_interface_height = 0.8 +support_infill_sparse_thickness = 0.18 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg index 472b0ce51b..9818f508e6 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg @@ -12,6 +12,4 @@ setting_version = 2 [values] material_standby_temperature = 100 -prime_tower_enable = False -support_infill_rate = 25 -support_interface_height = 0.8 +prime_tower_enable = False \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg index b19f9811a8..677d13d9d9 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg @@ -12,4 +12,4 @@ setting_version = 2 [values] material_print_temperature = =default_material_print_temperature + 5 -material_standby_temperature = 100 +material_standby_temperature = 100 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg index 4d9f61e628..8e28e39ef7 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg @@ -13,3 +13,4 @@ setting_version = 2 [values] layer_height = 0.4 material_standby_temperature = 100 +support_interface_height = 0.9 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg index 3b6bb267dc..4891dc64ab 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg @@ -13,3 +13,5 @@ setting_version = 2 [values] layer_height = 0.3 material_standby_temperature = 100 +support_infill_sparse_thickness = 0.6 +support_interface_height = 1.2 \ No newline at end of file diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index d90190885f..3a984318c7 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -17,6 +17,8 @@ acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / brim_width = 3 cool_fan_speed = 50 cool_min_speed = 5 +gradual_support_infill_step_height = 1.6 +gradual_support_infill_steps = 2 infill_line_width = =round(line_width * 0.8 / 0.7, 2) infill_overlap = 0 infill_pattern = triangles @@ -67,9 +69,10 @@ support_angle = 60 support_bottom_height = =layer_height * 2 support_bottom_pattern = zigzag support_bottom_stair_step_height = =layer_height -support_infill_rate = 25 +support_infill_rate = 50 +support_infill_sparse_thickness = 0.4 support_interface_enable = True -support_interface_height = =layer_height * 5 +support_interface_height = 0.6 support_interface_skip_height = =layer_height support_join_distance = 3 support_line_width = =round(line_width * 0.4 / 0.35, 2) diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index 1e9218d262..d0b3dad59f 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -13,6 +13,7 @@ acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500) cool_fan_speed_max = =cool_fan_speed +gradual_support_infill_steps = 2 jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) @@ -31,8 +32,10 @@ speed_wall_0 = =math.ceil(speed_wall * 25 / 30) support_bottom_height = =layer_height * 2 support_bottom_pattern = zigzag support_bottom_stair_step_height = =layer_height -support_infill_rate = 25 +support_infill_rate = 50 +support_infill_sparse_thickness = 0.2 support_interface_enable = True +support_interface_height = 0.6 support_interface_skip_height = =layer_height support_join_distance = 3 support_line_width = =round(line_width * 0.4 / 0.35, 2) From 4564b2a843955cdaf6b9ff70ca1641ef9fa7ffad Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 24 Jul 2017 10:40:14 +0200 Subject: [PATCH 353/379] Rebuild disallowed area when a limit_to_extruder_nr has been changed CURA-4069 Trigger to rebuild the disallowed area when a limit to extruder feature has been changed. --- cura/BuildVolume.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index cf75d75d5e..7c965c6cdf 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -527,6 +527,10 @@ class BuildVolume(SceneNode): self._updateExtraZClearance() rebuild_me = True + if setting_key in self._limit_to_extruder_settings: + self._updateDisallowedAreas() + rebuild_me = True + if rebuild_me: self.rebuild() @@ -969,3 +973,4 @@ class BuildVolume(SceneNode): _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"] _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"] From 74feabacd0db4a44ee9c8bad48edb3b18e902ae7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 24 Jul 2017 14:30:11 +0200 Subject: [PATCH 354/379] Add warning value for initial layer line width 150% seems about right. Then you get a warning value for lines thicker than 0.525mm on a 0.4mm nozzle. --- 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 5c7c246f58..cc73a675c7 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -833,6 +833,7 @@ "unit": "%", "default_value": 100.0, "minimum_value": "0.001", + "maximum_value_warning": "150", "settable_per_mesh": false, "settable_per_extruder": true } From 89cd11e62a8b285662284635e3f1fa5ff7ee1737 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 24 Jul 2017 16:18:15 +0200 Subject: [PATCH 355/379] Upgrade g-code flavour Volumatric to Volumetric Contributes to issue CURA-3998. --- .../VersionUpgrade26to27/VersionUpgrade26to27.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py index e2d7817077..4df64af95b 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py @@ -104,6 +104,11 @@ class VersionUpgrade26to27(VersionUpgrade): parser["metadata"] = {} parser["metadata"]["setting_version"] = "2" + #Renamed setting value for g-code flavour. + if "values" in parser and "machine_gcode_flavor" in parser["values"]: + if parser["values"]["machine_gcode_flavor"] == "RepRap (Volumatric)": + parser["values"]["machine_gcode_flavor"] = "RepRap (Volumetric)" + # Re-serialise the file. output = io.StringIO() parser.write(output) From a8a475a1a7da4e83ec808ffec932d100d7012af1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Jul 2017 17:18:04 +0200 Subject: [PATCH 356/379] Only stop the camera if the timer is actually running CURA-4081 --- .../NetworkPrinterOutputDevice.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index b14737a2a3..373521b4e9 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -313,15 +313,16 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): return True def _stopCamera(self): - self._camera_timer.stop() - if self._image_reply: - try: - self._image_reply.abort() - self._image_reply.downloadProgress.disconnect(self._onStreamDownloadProgress) - except RuntimeError: - pass # It can happen that the wrapped c++ object is already deleted. - self._image_reply = None - self._image_request = None + if self._camera_timer.isActive(): + self._camera_timer.stop() + if self._image_reply: + try: + self._image_reply.abort() + self._image_reply.downloadProgress.disconnect(self._onStreamDownloadProgress) + except RuntimeError: + pass # It can happen that the wrapped c++ object is already deleted. + self._image_reply = None + self._image_request = None def _startCamera(self): if self._use_stream: From fe3bccaf5fe21ce85e6098a5392250ab623820eb Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Tue, 25 Jul 2017 09:35:42 +0200 Subject: [PATCH 357/379] LayerView: Set color for comp. mode text Before it was using the system's default, which is not that nicely visible, if you are using a dark theme. --- plugins/LayerView/LayerView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index d8b37df719..5971798f58 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -142,6 +142,7 @@ Item id: compatibilityModeLabel anchors.left: parent.left text: catalog.i18nc("@label","Compatibility Mode") + color: UM.Theme.getColor("text") visible: UM.LayerView.compatibilityMode Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height From 5006356bfe51fb5b84fbc056181abdc155376aa6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 08:56:30 +0200 Subject: [PATCH 358/379] Improved Polish translation I received this new Polish translation for Cura that was better translated. Let's fill these in. --- resources/i18n/pl/cura.po | 589 +++--- resources/i18n/pl/fdmextruder.def.json.po | 107 +- resources/i18n/pl/fdmprinter.def.json.po | 2231 ++++++++++----------- 3 files changed, 1440 insertions(+), 1487 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index 7c4a2eacc2..de790d3348 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -1,19 +1,17 @@ -# Cura -# Copyright (C) 2017 Ultimaker -# This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# English translations for PACKAGE package. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2017. # msgid "" msgstr "" -"Project-Id-Version: Cura 2.6\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-30 15:32+0200\n" -"PO-Revision-Date: 2017-07-13 15:58+0200\n" -"Last-Translator: jagus85\n" -"Language-Team: reprapy.pl\n" -"Language: Polish\n" -"Lang-Code: pl\n" -"Country-Code: PL\n" +"PO-Revision-Date: 2017-07-19 12:47+0200\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -78,7 +76,7 @@ msgstr "Zapisuje kod GCode do pliku" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:22 msgctxt "@item:inlistbox" msgid "GCode File" -msgstr "Plik GCode" +msgstr "Plik GCode " #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:13 msgctxt "@label" @@ -88,7 +86,7 @@ msgstr "Doodle3D" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:17 msgctxt "@info:whatsthis" msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." -msgstr "Akceptuje kod G i wysyła je przez WiFi do Doodle3D WiFi-Box." +msgstr "Akceptuje G-code i wysyła je przez WiFi do Doodle3D WiFi-Box." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:36 msgctxt "@item:inmenu" @@ -103,7 +101,7 @@ msgstr "Drukuj z Doodle3D" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:38 msgctxt "@info:tooltip" msgid "Print with " -msgstr "Drukuj z " +msgstr "Drukuj z" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:49 msgctxt "@title:menu" @@ -139,7 +137,7 @@ msgstr "Charakterystyka Profila" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/__init__.py:15 msgctxt "@info:whatsthis" msgid "Create a flattend quality changes profile." -msgstr "Utwórz profil charakterystyczny profil jakości." +msgstr "Utwórz charakterystyczny profil jakości" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 msgctxt "@item:inmenu" @@ -159,7 +157,7 @@ msgstr "Drukowanie USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/__init__.py:17 msgctxt "@info:whatsthis" msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." -msgstr "Akceptuje kod G i wysyła je do drukarki. Wtyczka może również aktualizować oprogramowanie układowe." +msgstr "Akceptuje G-code i wysyła je do drukarki. Wtyczka może również aktualizować oprogramowanie układowe." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 msgctxt "@item:inmenu" @@ -189,12 +187,12 @@ msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka jest zajęta lu #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." -msgstr "Ta drukarka nie obsługuje drukowania USB, ponieważ wykorzystuje smak UltiGCode." +msgstr "Ta drukarka nie obsługuje drukowania USB, ponieważ korzysta z UltiGCode." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." -msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka nie obsługuje drukowania USB." +msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka nie obsługuje drukowania poprzez USB." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:107 msgctxt "@info" @@ -205,17 +203,17 @@ msgstr "Nie można zaktualizować oprogramowania, ponieważ nie ma podłączonyc #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." -msgstr "Nie znaleziono oprogramowania wymaganego dla drukarki w% s." +msgstr "Nie znaleziono oprogramowania wymaganego dla drukarki w %s." #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 msgctxt "X3G Writer Plugin Description" msgid "Writes X3G to a file" -msgstr "Zapisuje plik X3G" +msgstr "Zapisuje do pliku X3G" #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:22 msgctxt "X3G Writer File Description" msgid "X3G File" -msgstr "Plik X3G" +msgstr "Plik X3G " #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -245,7 +243,7 @@ msgstr "Nie udało się zapisać do {0}: {1}{0}: Wtyczka C #, python-brace-format msgctxt "@info:status" msgid "Exported profile to {0}" -msgstr "Eksportowany profil do {0}" +msgstr "Wyeksportowano profil do {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:199 @@ -967,7 +970,7 @@ msgstr "Nie można zaimportować profilu z {0}: {1 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" -msgstr "Profil importowany {0}" +msgstr "Profil zaimportowany {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:249 #, python-brace-format @@ -983,7 +986,7 @@ msgstr "Niestandardowy profil" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:278 msgctxt "@info:status" msgid "Profile is missing a quality type." -msgstr "Profil brakuje typu jakości." +msgstr "Profilowi brakuje typu jakości." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:300 #, python-brace-format @@ -994,12 +997,12 @@ msgstr "Nie można znaleźć typu jakości {0} dla bieżącej konfiguracji." #: /home/ruben/Projects/Cura/cura/BuildVolume.py:95 msgctxt "@info:status" msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models." -msgstr "Wysokość woluminu kompresji została zmniejszona ze względu na wartość ustawienia Print Sequence (Sekwencja wydruku), aby zapobiec kolizji z drukowanymi modelami." +msgstr "Wysokość obszaru roboczego została zmniejszona ze względu na wartość ustawienia Print Sequence (Sekwencja wydruku), aby zapobiec kolizji z wydrukowanymi modelami." #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 msgctxt "@info:status" msgid "Multiplying and placing objects" -msgstr "Mnożenie i umieszczanie przedmiotów" +msgstr "Zwielokrotnienie i umieszczanie przedmiotów" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 msgctxt "@title:window" @@ -1013,7 +1016,7 @@ msgid "" "

Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

\n" " " msgstr "" -"

Pojawił się fatalny wyjątek, którego nie możemy odzyskać!

\n" +"

Pojawił się fatalny wyjątek, z którego nie możemy odzyskać!

\n" "

Aby przesłać zgłoszenie błędu, skorzystaj z poniższych informacji http://github.com/Ultimaker/Cura/issues

\n" " " @@ -1025,7 +1028,7 @@ msgstr "Otwórz stronę sieci Web" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:238 msgctxt "@info:progress" msgid "Loading machines..." -msgstr "Ładowanie drukarki..." +msgstr "Ładowanie drukarek..." #: /home/ruben/Projects/Cura/cura/CuraApplication.py:594 msgctxt "@info:progress" @@ -1041,19 +1044,19 @@ msgstr "Ładowanie interfejsu ..." #, python-format msgctxt "@info" msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(szerokość).1f x %(głębokość).1f x %(wysokość).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1263 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" -msgstr "Jednocześnie można załadować tylko jeden plik kodu G. Pominięto import {0}" +msgstr "Jednocześnie można załadować tylko jeden plik G-code. Pominięto importowanie {0}" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1272 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" -msgstr "Nie można otworzyć żadnego innego pliku, jeśli ładuje się kod G. Pominięto import {0}" +msgstr "Nie można otworzyć żadnego innego pliku, jeśli ładuje się G-code. Pominięto importowanie {0}" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:53 msgctxt "@title" @@ -1101,22 +1104,22 @@ msgstr "Z (Wysokość)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 msgctxt "@label" msgid "Build Plate Shape" -msgstr "Konstruuj kształt płyty" +msgstr "Kształt stołu" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:198 msgctxt "@option:check" msgid "Machine Center is Zero" -msgstr "Centrum drukowania jest na zero" +msgstr "Środek drukarki to zero" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:209 msgctxt "@option:check" msgid "Heated Bed" -msgstr "Łóżko podgrzewane" +msgstr "Stół podgrzewany" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "GCode Flavor" -msgstr "Nadać Gkod" +msgstr "GCode Flavor" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:273 msgctxt "@label" @@ -1151,12 +1154,12 @@ msgstr "Wysokość ramy" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:351 msgctxt "@label" msgid "Number of Extruders" -msgstr "Liczba dysz" +msgstr "Liczba ekstruderów" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:379 msgctxt "@label" msgid "Material Diameter" -msgstr "Srednica filamentu" +msgstr "Średnica filamentu" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:540 @@ -1167,12 +1170,12 @@ msgstr "Rozmiar dyszy:" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:417 msgctxt "@label" msgid "Start Gcode" -msgstr "Rozpocznik Gkod" +msgstr "Rozpocznij Gcode" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:446 msgctxt "@label" msgid "End Gcode" -msgstr "Koniec Gkodu" +msgstr "Koniec Gcode'u" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:528 msgctxt "@label" @@ -1187,28 +1190,28 @@ msgstr "Korekcja dyszy X" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:567 msgctxt "@label" msgid "Nozzle offset Y" -msgstr "Korekcja dyszyt Y" +msgstr "Korekcja dyszy Y" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:592 msgctxt "@label" msgid "Extruder Start Gcode" -msgstr "Extruder Start Gcode" +msgstr "Początkowy Gcode ekstrudera" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:620 msgctxt "@label" msgid "Extruder End Gcode" -msgstr "Extruder End Gcode" +msgstr "Końcowy Gcode ekstrudera" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:20 msgctxt "@title:window" msgid "Doodle3D Settings" -msgstr "Ustawienia Doodle3D" +msgstr "Ustawienia Doodle3D " #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:53 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 msgctxt "@action:button" msgid "Save" -msgstr "Zapisać" +msgstr "Zapisz" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:23 msgctxt "@title:window" @@ -1238,7 +1241,7 @@ msgstr "%1" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:82 msgctxt "@action:button" msgid "Print" -msgstr "Wydrukować" +msgstr "Drukuj" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:105 @@ -1255,17 +1258,17 @@ msgstr "Zamknij" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:20 msgctxt "@title:window" msgid "Firmware Update" -msgstr "Aktualizacja firmware" +msgstr "Aktualizacja oprogramowania układowego" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:40 msgctxt "@label" msgid "Firmware update completed." -msgstr "Aktualizacja firmware zakończona." +msgstr "Aktualizacja oprogramowania zakończona" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:45 msgctxt "@label" msgid "Starting firmware update, this may take a while." -msgstr "Uruchamianie aktualizacji oprogramowania może potrwać chwilę." +msgstr "Uruchamianie aktualizacji oprogramowania, to może potrwać chwilę." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:50 msgctxt "@label" @@ -1275,22 +1278,22 @@ msgstr "Aktualizowanie oprogramowania." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:59 msgctxt "@label" msgid "Firmware update failed due to an unknown error." -msgstr "Aktualizacja oprogramowania nie powiodła się z powodu nieznanego błędu." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu nieznanego błędu." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:62 msgctxt "@label" msgid "Firmware update failed due to an communication error." -msgstr "Aktualizacja oprogramowania nie powiodła się z powodu błędu komunikacji." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu błędu komunikacji." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:65 msgctxt "@label" msgid "Firmware update failed due to an input/output error." -msgstr "Aktualizacja oprogramowania nie powiodła się z powodu błędu wejścia / wyjścia." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu błędu wejścia / wyjścia." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:68 msgctxt "@label" msgid "Firmware update failed due to missing firmware." -msgstr "Aktualizacja oprogramowania nie powiodła się z powodu braku oprogramowania firmowego." +msgstr "Aktualizacja oprogramowania nie powiodła się z powodu utraconego oprogramowania." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:71 msgctxt "@label" @@ -1309,7 +1312,7 @@ msgid "" "\n" "Select your printer from the list below:" msgstr "" -"Aby drukować bezpośrednio w drukarce w sieci, upewnij się, że drukarka jest podłączona do sieci przy użyciu kabla sieciowego lub podłączając drukarkę do sieci WIFI. Jeśli nie podłączasz Cury do drukarki, możesz nadal używać dysku USB do przesyłania plików g-code do drukarki.\n" +"Aby drukować bezpośrednio w drukarce w sieci, upewnij się, że drukarka jest podłączona do sieci przy użyciu kabla sieciowego lub sieci WIFI. Jeśli nie podłączasz Cury do drukarki, możesz nadal używać dysku USB do przesyłania plików g-code do drukarki.\n" "\n" "Wybierz drukarkę z poniższej listy:" @@ -1340,7 +1343,7 @@ msgstr "Odśwież" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 msgctxt "@label" msgid "If your printer is not listed, read the network-printing troubleshooting guide" -msgstr "Jeśli drukarka nie ma na liście, przeczytaj o Przewodnik o rozwiązywaniu problemów z drukowaniem sieciowym" +msgstr "Jeśli drukarka nie ma na liście, przeczytaj przewodnik o rozwiązywaniu problemów z drukowaniem sieciowym" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 msgctxt "@label" @@ -1355,7 +1358,7 @@ msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 msgctxt "@label" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Rozszerzony" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 msgctxt "@label" @@ -1375,7 +1378,7 @@ msgstr "Adres" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 msgctxt "@label" msgid "The printer at this address has not yet responded." -msgstr "Drukarka pod tym adresem nie odpowiedziała jeszcze." +msgstr "Drukarka pod tym adresem jeszcze nie odpowiedziała." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 @@ -1416,12 +1419,12 @@ msgstr "Uaktywnij konfigurację" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" -msgstr "Wtyczka przetwarzania po przetworzeniu" +msgstr "Plugin post-processingu" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 msgctxt "@label" msgid "Post Processing Scripts" -msgstr "Skrypty po przetworzeniu" +msgstr "Skrypty post-processingu" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 msgctxt "@action" @@ -1466,7 +1469,7 @@ msgstr "Tryb zgodności" #: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:199 msgctxt "@label" msgid "Show Travels" -msgstr "Pokaż przejścia" +msgstr "Pokaż ruch jałowy" #: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:205 msgctxt "@label" @@ -1521,7 +1524,7 @@ msgstr "Wysokość (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 msgctxt "@info:tooltip" msgid "The base height from the build plate in millimeters." -msgstr "Wysokość podstawy z płyty konstrukcyjnej w milimetrach." +msgstr "Wysokość podstawy od stołu w milimetrach." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 msgctxt "@action:label" @@ -1531,17 +1534,17 @@ msgstr "Baza(mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 msgctxt "@info:tooltip" msgid "The width in millimeters on the build plate." -msgstr "Szerokość w milimetrach na płycie podłoża." +msgstr "Szerokość w milimetrach na stole." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 msgctxt "@action:label" msgid "Width (mm)" -msgstr "Szerokość (mm)" +msgstr "Szerokość(mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" msgid "The depth in millimeters on the build plate" -msgstr "Głębokość w milimetrach na płycie " +msgstr "Głębokość w milimetrach na stole " #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 msgctxt "@action:label" @@ -1551,7 +1554,7 @@ msgstr "Głębokość (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 msgctxt "@info:tooltip" msgid "By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh." -msgstr "Domyślnie białe piksele przedstawiają wysokie punkty na siatce, a czarne piksele przedstawiają niskie punkty na siatce. Zmień tę opcję, aby odwrócić takie zachowanie, że czarne piksele przedstawiają wysokie punkty na siatce, a białe piksele przedstawiają niskie punkty na siatce." +msgstr "Domyślnie białe piksele przedstawiają wysokie punkty na siatce, a czarne piksele przedstawiają niskie punkty na siatce. Zmień tę opcję, aby odwrócić takie zachowanie, tak żeby czarne piksele przedstawiają wysokie punkty na siatce, a białe piksele przedstawiają niskie punkty na siatce." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" @@ -1566,7 +1569,7 @@ msgstr "Ciemniejsze jest wyższe" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 msgctxt "@info:tooltip" msgid "The amount of smoothing to apply to the image." -msgstr "Ilość wygładzania zastosowana do obrazu." +msgstr "Ilość wygładzania do zastosowania do obrazu." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 msgctxt "@action:label" @@ -1629,13 +1632,13 @@ msgstr "Ustawienia drukarki" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:107 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" -msgstr "Jak rozwiązywać konflikt w maszynie?" +msgstr "Jak powinny być rozwiązywane błędy w maszynie?" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:127 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 msgctxt "@action:label" msgid "Type" -msgstr "Rodzaj/Typ" +msgstr "Typ" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:143 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:200 @@ -1655,7 +1658,7 @@ msgstr "Ustawienia profilu" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" -msgstr "W jaki sposób rozwiązać konflikt w profilu?" +msgstr "Jak powinien zostać rozwiązany problem z profilem?" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:215 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 @@ -1691,13 +1694,13 @@ msgstr "Ustawienia materiału" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:268 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" -msgstr "W jaki sposób należy rozwiązać konflikt w materiale?" +msgstr "Jak powinien zostać rozwiązany problem z materiałem?" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:311 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 msgctxt "@action:label" msgid "Setting visibility" -msgstr "Ustaw widoczność" +msgstr "Ustawienie widoczności" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:320 msgctxt "@action:label" @@ -1708,7 +1711,7 @@ msgstr "Tryb" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 msgctxt "@action:label" msgid "Visible settings:" -msgstr "Ustawienia widoczne:" +msgstr "Widoczne ustawienie:" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:340 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 @@ -1719,7 +1722,7 @@ msgstr "%1 poza %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:366 msgctxt "@action:warning" msgid "Loading a project will clear all models on the buildplate" -msgstr "Ładowanie projektu spowoduje wyczyszczenie wszystkich modeli na płycie montażowej" +msgstr "Załadowanie projektu spowoduje usunięcie wszystkich modeli ze stołu" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:385 msgctxt "@action:button" @@ -1730,12 +1733,12 @@ msgstr "Otwórz" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" msgid "Select Printer Upgrades" -msgstr "Wybierz Aktualizacje drukarki" +msgstr "Wybierz ulepszenia drukarki" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 msgctxt "@label" msgid "Please select any upgrades made to this Ultimaker 2." -msgstr "Proszę wybrać dowolne uaktualnienia wykonane w tym Ultimaker 2." +msgstr "Proszę wybrać ulepszenia w tym Ultimaker 2." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 msgctxt "@label" @@ -1745,22 +1748,22 @@ msgstr "Olsson Block" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 msgctxt "@title" msgid "Build Plate Leveling" -msgstr "Zbuduj poziomowanie płyt" +msgstr "Poziomowanie stołu" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 msgctxt "@label" msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." -msgstr "Aby upewnić się, że wydruki są świetne, można teraz wyregulować płytę montażową. Po kliknięciu przycisku \"Przejdź do następnego położenia\" dysza będzie się poruszać w różnych pozycjach, które można wyregulować." +msgstr "Aby upewnić się, że wydruki będą wychodziły świetne, możesz teraz wyregulować stół. Po kliknięciu przycisku \"Przejdź do następnego położenia\" dysza będzie się poruszać do różnych pozycji, które można wyregulować." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 msgctxt "@label" msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." -msgstr "Dla każdej pozycji; Włóż kartkę papieru pod dyszę i wyreguluj wysokość płyty. Wysokość blatu drukującego jest prawidłowa, gdy papier jest lekko uchwycony przez końcówkę dyszy." +msgstr "Dla każdej pozycji; Włóż kartkę papieru pod dyszę i wyreguluj wysokość stołu roboczego. Wysokość stołu jest prawidłowa, gdy papier stawia lekki opór." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 msgctxt "@action:button" msgid "Start Build Plate Leveling" -msgstr "Zacznij od wyrównywania poziomu płyt" +msgstr "Rozpocznij poziomowanie stołu roboczego" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 msgctxt "@action:button" @@ -1770,42 +1773,42 @@ msgstr "Przejdź do następnego położenia" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 msgctxt "@title" msgid "Upgrade Firmware" -msgstr "Uaktualnij oprogramowanie firmowe" +msgstr "Uaktualnij oprogramowanie" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 msgctxt "@label" msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work." -msgstr "Oprogramowanie sprzętowe jest częścią oprogramowania działającego bezpośrednio na drukarce 3D. Oprogramowanie to steruje silnikami krokowymi, reguluje temperaturę i ostatecznie sprawia, że drukarka działa." +msgstr "Oprogramowanie ukłądowe jest częścią oprogramowania działającego bezpośrednio na drukarce 3D. Oprogramowanie to steruje silnikami krokowymi, reguluje temperaturę i ostatecznie sprawia, że drukarka działa." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 msgctxt "@label" msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." -msgstr "Oprogramowanie firmowe dostarczane z nowymi drukarkami działa, ale nowe wersje mają zazwyczaj więcej funkcji i ulepszeń." +msgstr "Oprogramowanie ukłądowe dostarczane z nowymi drukarkami działa, ale nowe wersje mają zazwyczaj więcej funkcji i ulepszeń." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 msgctxt "@action:button" msgid "Automatically upgrade Firmware" -msgstr "Automatycznie uaktualnij oprogramowanie firmowe" +msgstr "Automatycznie uaktualnij oprogramowanie" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 msgctxt "@action:button" msgid "Upload custom Firmware" -msgstr "Prześlij niestandardowe oprogramowanie firmowe" +msgstr "Prześlij niestandardowe oprogramowanie" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 msgctxt "@title:window" msgid "Select custom firmware" -msgstr "Wybierz niestandardowe oprogramowanie firmowe" +msgstr "Wybierz niestandardowe oprogramowanie" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 msgctxt "@label" msgid "Please select any upgrades made to this Ultimaker Original" -msgstr "Proszę wybrać dowolne uaktualnienia wykonane w tym Ultimaker Original" +msgstr "Proszę wybrać ulepszenia wykonane w tym Ultimaker Original" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 msgctxt "@label" msgid "Heated Build Plate (official kit or self-built)" -msgstr "Płyta grzewcza podgrzewana (oficjalny zestaw lub samonośny)" +msgstr "Płyta grzewcza (zestaw oficjalny lub własnej roboty)" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 msgctxt "@title" @@ -1825,7 +1828,7 @@ msgstr "Rozpocznij sprawdzanie drukarki" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 msgctxt "@label" msgid "Connection: " -msgstr "Połączenie: " +msgstr "Połączenie:" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" @@ -1840,14 +1843,14 @@ msgstr "Nie połączono" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 msgctxt "@label" msgid "Min endstop X: " -msgstr "Min. Krańcówki X: " +msgstr "Krańcówka min. X: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 msgctxt "@info:status" msgid "Works" -msgstr "Prace" +msgstr "Pracuje" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 @@ -1861,12 +1864,12 @@ msgstr "Niesprawdzone" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 msgctxt "@label" msgid "Min endstop Y: " -msgstr "Min. Krańcówki Y: " +msgstr "Krańcówka min. Y: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 msgctxt "@label" msgid "Min endstop Z: " -msgstr "Min. Krańcówki Z: " +msgstr "Krańcówka min. Z: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 msgctxt "@label" @@ -1893,7 +1896,7 @@ msgstr "Kontrola temperatury płyty konstrukcyjnej:" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 msgctxt "@info:status" msgid "Checked" -msgstr "Sprawdzanie" +msgstr "Sprawdzone" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 msgctxt "@label" @@ -1903,7 +1906,7 @@ msgstr "Wszystko w porządku! Skończono sprawdzenie." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" -msgstr "Nie jest podłączony do drukarki" +msgstr "Nie podłączono do drukarki" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:91 msgctxt "@label:MonitorStatus" @@ -1947,22 +1950,22 @@ msgstr "Usuń wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:238 msgctxt "@label:" msgid "Resume" -msgstr "Wznawianie" +msgstr "Wznów" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:242 msgctxt "@label:" msgid "Pause" -msgstr "Wstrzymano" +msgstr "Wstrzymaj" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:271 msgctxt "@label:" msgid "Abort Print" -msgstr "Przerwij druk" +msgstr "Przerwij wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:281 msgctxt "@window:title" msgid "Abort print" -msgstr "Przerwij druk" +msgstr "Przerwij wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:283 msgctxt "@label" @@ -1980,8 +1983,8 @@ msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" msgstr "" -"Dostosowyłeś ustawienia profilu.\n" -"Czy chcesz zachować lub usunąć te ustawienia?" +"Dostosowałeś ustawienia profilu.\n" +"Chcesz zachować, czy usunąć te ustawienia?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -1991,7 +1994,7 @@ msgstr "Ustawienia profilu" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 msgctxt "@title:column" msgid "Default" -msgstr "Nieobecny" +msgstr "Domyślne" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 msgctxt "@title:column" @@ -2002,7 +2005,7 @@ msgstr "Dostosowane" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:564 msgctxt "@option:discardOrKeep" msgid "Always ask me this" -msgstr "Zawsze proszę o to" +msgstr "Zawsze pytaj o to" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:565 @@ -2014,7 +2017,7 @@ msgstr "Odrzuć i nigdy nie pytaj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:566 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" -msgstr "Zachowaj i nigdy nie pytaj ponownie" +msgstr "Zachowaj i nigdy nie pytaj" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 msgctxt "@action:button" @@ -2024,7 +2027,7 @@ msgstr "Odrzuć" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 msgctxt "@action:button" msgid "Keep" -msgstr "Zachować" +msgstr "Zachowaj" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 msgctxt "@action:button" @@ -2094,7 +2097,7 @@ msgstr "Koszt na metr" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." -msgstr "Ten materiał jest powiązany z%1 i dzieli się swoimi właściwościami." +msgstr "Ten materiał jest powiązany z %1 i dzieli się niekórymi swoimi właściwościami." #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:234 msgctxt "@label" @@ -2114,22 +2117,22 @@ msgstr "Informacje dotyczące przyczepności" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:284 msgctxt "@label" msgid "Print settings" -msgstr "Ustawienia drukowania" +msgstr "Ustawienia druku" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 msgctxt "@title:tab" msgid "Setting Visibility" -msgstr "Ustaw widoczność" +msgstr "Widoczność ustawienia" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 msgctxt "@label:textbox" msgid "Check all" -msgstr "Zaznacz wszystkie" +msgstr "Zaznacz wszystko" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 msgctxt "@title:column" msgid "Setting" -msgstr "Tło/oprawa" +msgstr "Ustawienie" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 msgctxt "@title:column" @@ -2155,7 +2158,7 @@ msgstr "Ogólny" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126 msgctxt "@label" msgid "Interface" -msgstr "Łącznik" +msgstr "Interfejs" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137 msgctxt "@label" @@ -2185,7 +2188,7 @@ msgstr "Musisz zrestartować aplikację, aby te zmiany zaczęły obowiązywać." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:280 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." -msgstr "Cięcie automatycznie podczas zmiany ustawień." +msgstr "Tnij automatycznie podczas zmiany ustawień." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:288 msgctxt "@option:check" @@ -2195,7 +2198,7 @@ msgstr "Automatyczne Cięcie" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302 msgctxt "@label" msgid "Viewport behavior" -msgstr "Zachowanie w przeglądarce" +msgstr "Zachowanie okna edycji" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:310 msgctxt "@info:tooltip" @@ -2215,17 +2218,17 @@ msgstr "Przenosi kamerę, aby model był w centrum widoku, gdy wybrano model" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:331 msgctxt "@action:button" msgid "Center camera when item is selected" -msgstr "Kamera centralna po wybraniu elementu" +msgstr "Wyśrodkuj kamerę kiedy przedmiot jest zaznaczony" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" -msgstr "Czy domyślne odwzorowanie zoomu cura zostanie odwrócone?" +msgstr "Czy domyślne zachowanie zoomu powinno zostać odwrócone?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346 msgctxt "@action:button" msgid "Invert the direction of camera zoom." -msgstr "Odwróć kierunek powiększenia kamery." +msgstr "Odwróć kierunek zoomu kamery." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355 msgctxt "@info:tooltip" @@ -2240,22 +2243,22 @@ msgstr "Upewnij się, że modele są oddzielone" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:368 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" -msgstr "Czy modele na platformie powinny być przemieszczane w dół, aby dotknąć płyty montażowej?" +msgstr "Czy modele na platformie powinny być przesunięte w dół, aby dotknęły stołu roboczego?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:373 msgctxt "@option:check" msgid "Automatically drop models to the build plate" -msgstr "Automatycznie upuść modele na płytę konstrukcyjną" +msgstr "Automatycznie upuść modele na stół roboczy" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." -msgstr "Pokaż komunikat ostrzegawczy w tekście G-kodu." +msgstr "Pokaż komunikat ostrzegawczy w tekście G-code." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394 msgctxt "@option:check" msgid "Caution message in gcode reader" -msgstr "Komunikat ostrzegawczy w tekście G-kodu" +msgstr "Komunikat ostrzegawczy w tekście G-code" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:401 msgctxt "@info:tooltip" @@ -2265,7 +2268,7 @@ msgstr "Czy warstwa powinna być wymuszona w trybie zgodności?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:406 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" -msgstr "Wymuszenie trybu widoku warstw (wymaga ponownego uruchomienia)" +msgstr "Wymuszenie widoku warstw w trybie zgodności (wymaga ponownego uruchomienia)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:422 msgctxt "@label" @@ -2275,7 +2278,7 @@ msgstr "Otwieranie i zapisywanie plików" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" -msgstr "Czy modele powinny być skalowane do objętości kompilacji, jeśli są zbyt duże?" +msgstr "Czy modele powinny być skalowane do wielkości obszaru roboczego, jeśli są zbyt duże?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433 msgctxt "@option:check" @@ -2285,7 +2288,7 @@ msgstr "Skaluj duże modele" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442 msgctxt "@info:tooltip" msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?" -msgstr "Model może wydawać się bardzo mały, jeśli jego jednostka jest na przykład w metrach, a nie w milimetrach. Czy modele powinny być skalowane?" +msgstr "Model może wydawać się bardzo mały, jeśli jego jednostka jest na przykład w metrach, a nie w milimetrach. Czy takie modele powinny być skalowane?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:447 msgctxt "@option:check" @@ -2295,7 +2298,7 @@ msgstr "Skaluj bardzo małe modele" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" -msgstr "Czy przedrostek oparty na nazwie drukarki zostanie automatycznie dodany do nazwy zadania drukowania?" +msgstr "Czy przedrostek oparty na nazwie drukarki powinien być automatycznie dodawany do nazwy zadania?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461 msgctxt "@option:check" @@ -2305,12 +2308,12 @@ msgstr "Dodaj przedrostek maszyny do nazwy zadania" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:470 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" -msgstr "Czy należy podsumować podczas zapisywania pliku projektu?" +msgstr "Czy podsumowanie powinno być wyświetlane podczas zapisu projektu?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:474 msgctxt "@option:check" msgid "Show summary dialog when saving project" -msgstr "Pokaż okno dialogowe podsumowania przy zapisywaniu projektu" +msgstr "Pokaż okno podsumowania podczas zapisywaniu projektu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483 msgctxt "@info:tooltip" @@ -2340,12 +2343,12 @@ msgstr "Zawsze importuj modele" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542 msgctxt "@info:tooltip" msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." -msgstr "Po wprowadzeniu zmian w profilu i przechodzeniu na inny użytkownik zostanie wyświetlone okno dialogowe z pytaniem, czy chcesz zachować swoje modyfikacje, czy nie, lub możesz wybrać domyślne zachowanie i nigdy nie wyświetlać tego dialogu." +msgstr "Kiedy dokonasz zmian w profilu i przełączysz się na inny, zostanie wyświetlone okno z pytaniem, czy chcesz zachować twoje zmiany, czy nie. Możesz też wybrać domyślne zachowanie, żeby to okno już nigdy nie było pokazywane." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:551 msgctxt "@label" msgid "Override Profile" -msgstr "Zastąp profil" +msgstr "Nadpisz profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:600 msgctxt "@label" @@ -2355,22 +2358,22 @@ msgstr "Prywatność" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:607 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" -msgstr "Czy Cura ma sprawdzać aktualizacje podczas uruchamiania programu?" +msgstr "Czy Cura ma sprawdzać dostępność aktualizacji podczas uruchamiania programu?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:612 msgctxt "@option:check" msgid "Check for updates on start" -msgstr "Sprawdź, czy są aktualizacje na początku" +msgstr "Sprawdź, dostępność aktualizacji podczas uruchamiania" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:622 msgctxt "@info:tooltip" msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored." -msgstr "Czy anonimowe dane o wydruku zostaną przesłane do firmy Ultimaker? Uwaga, nie są wysyłane ani przechowywane żadne modele, adresy IP ani inne dane umożliwiające identyfikację użytkownika." +msgstr "Czy anonimowe dane na temat wydruku mają być wysyłane do Ultimaker? Uwaga. Żadne modele, adresy IP, ani żadne inne dane osobiste nie będą wysyłane i/lub przechowywane." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:627 msgctxt "@option:check" msgid "Send (anonymous) print information" -msgstr "Wyślij informacje o drukowaniu (anonimowym)" +msgstr "Wyślij (anonimowe) informacje o drukowaniu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:466 @@ -2415,7 +2418,7 @@ msgstr "Stan:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" -msgstr "Wyczyść stół" +msgstr "Oczekiwanie na wyczyszczenie stołu roboczego" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 msgctxt "@label:MonitorStatus" @@ -2452,13 +2455,13 @@ msgstr "Duplikuj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:194 msgctxt "@action:button" msgid "Import" -msgstr "Import" +msgstr "Importuj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 msgctxt "@action:button" msgid "Export" -msgstr "Export" +msgstr "Eksportuj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 msgctxt "@label %1 is printer name" @@ -2468,7 +2471,7 @@ msgstr "Drukarka: %1" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 msgctxt "@action:button" msgid "Update profile with current settings/overrides" -msgstr "Aktualizuj profil z bieżącymi ustawieniami / nadpisaniem" +msgstr "Aktualizuj profil z bieżącymi ustawieniami" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 msgctxt "@action:button" @@ -2478,7 +2481,7 @@ msgstr "Odrzuć bieżące zmiany" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 msgctxt "@action:label" msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." -msgstr "Ten profil używa ustawień domyślnych określonych przez drukarkę, dlatego nie ma żadnych ustawień / zastąpień na poniższej liście." +msgstr "Ten profil używa ustawień domyślnych określonych przez drukarkę, dlatego nie ma żadnych ustawień z poniższej liście." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 msgctxt "@action:label" @@ -2503,22 +2506,22 @@ msgstr "Stwórz profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 msgctxt "@title:window" msgid "Duplicate Profile" -msgstr "Duplikat profilu" +msgstr "Duplikuj profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 msgctxt "@window:title" msgid "Import Profile" -msgstr "Import Profilu" +msgstr "Importuj Profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 msgctxt "@title:window" msgid "Import Profile" -msgstr "Import Profilu" +msgstr "Importuj Profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 msgctxt "@title:window" msgid "Export Profile" -msgstr "Export Profilu" +msgstr "Eksportuj Profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:468 @@ -2544,7 +2547,7 @@ msgstr "Stwórz" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:166 msgctxt "@action:button" msgid "Duplicate" -msgstr "Duplicat" +msgstr "Duplikuj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:295 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:303 @@ -2566,12 +2569,12 @@ msgstr "Pomyślnie zaimportowano materiał %1" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:342 msgctxt "@title:window" msgid "Export Material" -msgstr "Export Materiału" +msgstr "Eksportuj Materiał" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:346 msgctxt "@info:status" msgid "Failed to export material to %1: %2" -msgstr "Nie udało się wyeksportować materiałów do %1: %2" +msgstr "Nie udało się wyeksportować materiału do %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:352 msgctxt "@info:status" @@ -2607,7 +2610,7 @@ msgstr "Ściany wewnętrzne" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:181 msgctxt "@tooltip" msgid "Skin" -msgstr "poszycie zewnętrzne" +msgstr "Skin" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:182 msgctxt "@tooltip" @@ -2617,22 +2620,22 @@ msgstr "Wypełnienie" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:183 msgctxt "@tooltip" msgid "Support Infill" -msgstr "Wypełnienie podpór" +msgstr "Wypełnienie podpór " #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:184 msgctxt "@tooltip" msgid "Support Interface" -msgstr "Łącznenie podpór" +msgstr "Łączenie podpory " #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:185 msgctxt "@tooltip" msgid "Support" -msgstr "Wsparcie/Podpory" +msgstr "Podpory " #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:186 msgctxt "@tooltip" msgid "Travel" -msgstr "Przejazdy" +msgstr "Ruch jałowy" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:187 msgctxt "@tooltip" @@ -2667,7 +2670,7 @@ msgstr "O Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." -msgstr "Kompletne rozwiązanie do druku trójwymiarowego z włókna ciągłego." +msgstr "Kompletne rozwiązanie do druku przestrzennego." #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 msgctxt "@info:credit" @@ -2691,12 +2694,12 @@ msgstr "Struktura aplikacji" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 msgctxt "@label" msgid "GCode generator" -msgstr "GCode generator" +msgstr "Generator GCode " #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 msgctxt "@label" msgid "Interprocess communication library" -msgstr "Biblioteka komunikacyjna międzyprocesowa" +msgstr "Biblioteka komunikacji międzyprocesowej" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 msgctxt "@label" @@ -2704,19 +2707,22 @@ msgid "Programming language" msgstr "Język programowania" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +#, fuzzy msgctxt "@label" msgid "GUI framework" -msgstr "Struktura GUI" +msgstr "Framework GUI " #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +#, fuzzy msgctxt "@label" msgid "GUI framework bindings" -msgstr "Wiązania struktury GUI" +msgstr "GUI framework bindings" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +#, fuzzy msgctxt "@label" msgid "C/C++ Binding library" -msgstr "C/C++biblioteka" +msgstr "C/C++ Binding library" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 msgctxt "@label" @@ -2726,12 +2732,12 @@ msgstr "Format wymiany danych" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 msgctxt "@label" msgid "Support library for scientific computing " -msgstr "Biblioteka wsparcia dla komputerów naukowych " +msgstr "Wsparcie biblioteki dla obliczeń naukowych" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 msgctxt "@label" msgid "Support library for faster math" -msgstr "Biblioteka pomocy dla szybszej matematyki" +msgstr "Wsparcie biblioteki dla szybszej matematyki" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 msgctxt "@label" @@ -2741,7 +2747,7 @@ msgstr "Wsparcie biblioteki do obsługi plików STL" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 msgctxt "@label" msgid "Support library for handling 3MF files" -msgstr "Obsługa biblioteki do obsługi plików 3MF" +msgstr "Wsparcie biblioteki do obsługi plików 3MF" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 msgctxt "@label" @@ -2749,14 +2755,16 @@ msgid "Serial communication library" msgstr "Biblioteka komunikacji szeregowej" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +#, fuzzy msgctxt "@label" msgid "ZeroConf discovery library" -msgstr "Biblioteka wykrywania ZeroConf" +msgstr "ZeroConf discovery library" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +#, fuzzy msgctxt "@label" msgid "Polygon clipping library" -msgstr "Biblioteka przycinająca wielokątów" +msgstr "Polygon clipping library" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 msgctxt "@label" @@ -2766,7 +2774,7 @@ msgstr "Czcionka" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "SVG icons" -msgstr "SVG ikony" +msgstr "Ikony SVG" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:60 msgctxt "@label:textbox" @@ -2776,27 +2784,27 @@ msgstr "Szukanie..." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:337 msgctxt "@action:menu" msgid "Copy value to all extruders" -msgstr "Skopiuj wartość do wszystkich wytłaczarek" +msgstr "Skopiuj wartość do wszystkich ekstruderów" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:352 msgctxt "@action:menu" msgid "Hide this setting" -msgstr "Ukryj to ustawienie" +msgstr "Ukryj tę opcję" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:362 msgctxt "@action:menu" msgid "Don't show this setting" -msgstr "Nie pokazuj tego ustawienia" +msgstr "Nie pokazuj tej opcji" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:366 msgctxt "@action:menu" msgid "Keep this setting visible" -msgstr "Utrzymaj to ustawienie" +msgstr "Pozostaw tę opcję widoczną" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:385 msgctxt "@action:menu" msgid "Configure setting visiblity..." -msgstr "Skonfiguruj widoczne ustawienia ..." +msgstr "Skonfiguruj widoczność ustawień..." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:93 msgctxt "@label" @@ -2805,14 +2813,14 @@ msgid "" "\n" "Click to make these settings visible." msgstr "" -"Niektóre ukryte ustawienia używają wartości różniących się od ich normalnej wartości obliczonej.\n" +"Niektóre ukryte ustawienia używają wartości różniących się od ich normalnej, obliczonej wartości.\n" "\n" "Kliknij, aby te ustawienia były widoczne." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:60 msgctxt "@label Header for list of settings." msgid "Affects" -msgstr "Wpłynąć" +msgstr "Wpływać" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:65 msgctxt "@label Header for list of settings." @@ -2822,12 +2830,13 @@ msgstr "Pod wpływem" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:155 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "To ustawienie jest zawsze dzielone między wszystkie wytłaczarki. Zmiana tutaj zmieni wartość dla wszystkich wytłaczarek" +msgstr "To ustawienie jest zawsze dzielone między wszystkie ekstrudery. Zmiana jego wartości tutaj spowoduje zmianę dla wszystkich ekstruderów" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:158 +#, fuzzy msgctxt "@label" msgid "The value is resolved from per-extruder values " -msgstr "Wartość jest rozdzielana z wartości dla każdego wytłaczarki" +msgstr "The value is resolved from per-extruder values " #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:184 msgctxt "@label" @@ -2836,9 +2845,9 @@ msgid "" "\n" "Click to restore the value of the profile." msgstr "" -"To ustawienie ma inną wartość niż profil.\n" +"To ustawienie ma inną wartość niż w profilu.\n" "\n" -"Kliknij, aby przywrócić wartość profilu." +"Kliknij, aby przywrócić wartość z profilu." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:282 msgctxt "@label" @@ -2854,17 +2863,17 @@ msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:185 msgctxt "@tooltip" msgid "Print Setup

Edit or review the settings for the active print job." -msgstr "Ustawienia drukowania

Edytuj lub przejrzyj ustawienia dla aktywnego zadania drukowania." +msgstr "Ustawienia drukowania

Edytuj lub przejrzyj ustawienia dla aktywnego zadania." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:284 msgctxt "@tooltip" msgid "Print Monitor

Monitor the state of the connected printer and the print job in progress." -msgstr "Monitor wydruku

Monitorowanie stanu podłączonej drukarki i zadania drukowania w toku." +msgstr "Monitor wydruku

Monitorowanie stanu podłączonej drukarki i aktualnego zadania." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:337 msgctxt "@label:listbox" msgid "Print Setup" -msgstr "Ustawienia drukowania" +msgstr "Ustawienia druku" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:337 msgctxt "@label:listbox" @@ -2873,7 +2882,7 @@ msgid "" "G-code files cannot be modified" msgstr "" "Konfiguracja wydruku jest wyłączona\n" -"G-kod nie można zmodyfikować plików" +"Pliki G-code nie mogą zostać zmodyfikowane" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:644 msgctxt "@tooltip" @@ -2883,7 +2892,7 @@ msgstr "Zalecana konfiguracja wydruku

Drukowanie z zalecanymi us #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:649 msgctxt "@tooltip" msgid "Custom Print Setup

Print with finegrained control over every last bit of the slicing process." -msgstr "Niestandardowa konfiguracja wydruku

Drukowanie z precyzyjną kontrolą nad każdym ostatnim krokiem procesu krojenia." +msgstr "Niestandardowa konfiguracja wydruku

Drukowanie z precyzyjną kontrolą nad każdym elementem procesu cięcia." #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 msgctxt "@title:menuitem %1 is the automatically selected material" @@ -2904,15 +2913,15 @@ msgstr "Automatyczny: %1" msgctxt "@label" msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" -msgstr[0] "Wydrukuj wybrane modele:" -msgstr[1] "Wydrukuj wybrane modele:" +msgstr[0] "Wydrukuj wybrany model z:" +msgstr[1] "Wydrukuj wybrane modele z:" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:82 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "Pomnożyć wybrany model" -msgstr[1] "Pomnożyć wybrany modele" +msgstr[0] "Zduplikuj wybrany model" +msgstr[1] "Zduplikuj wybrane modele" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:109 msgctxt "@label" @@ -2922,7 +2931,7 @@ msgstr "Liczba kopii" #: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 msgctxt "@title:menu menubar:file" msgid "Open &Recent" -msgstr "Otwórz&ostatnio używane" +msgstr "Otwórz &ostatnio używane" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 msgctxt "@info:status" @@ -2932,17 +2941,17 @@ msgstr "Nie podłączono drukarki" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 msgctxt "@label" msgid "Hotend" -msgstr "Blok grzejny/hotend" +msgstr "Głowica" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:119 msgctxt "@tooltip" msgid "The current temperature of this extruder." -msgstr "Bieżąca temperatura głowicy drukującej." +msgstr "Bieżąca temperatura głowicy drukującej" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:154 msgctxt "@tooltip" msgid "The colour of the material in this extruder." -msgstr "Kolor materiału w tej wytłaczarce." +msgstr "Kolor materiału w tym ekstruderze." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:186 msgctxt "@tooltip" @@ -2952,22 +2961,22 @@ msgstr "Materiał w głowicy drukującej." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:218 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." -msgstr "Dysza włożona do tej głowicy drukującej." +msgstr "Dysza włożona do tego ekstrudera." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:249 msgctxt "@label" msgid "Build plate" -msgstr "Płyta/Stół" +msgstr "Stół roboczy" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:278 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." -msgstr "Temperatura docelowa podgrzanego stołu. Stół rozgrzeje się lub ochłodzi w kierunku tej temperatury. Jeśli jest 0, grzanie stołu jest wyłączone." +msgstr "Temperatura docelowa podgrzewanego stołu. Stół rozgrzeje się lub schłodzi w kierunku tej temperatury. Jeśli ustawione jest 0, grzanie stołu jest wyłączone." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:310 msgctxt "@tooltip" msgid "The current temperature of the heated bed." -msgstr "Bieżąca temperatura ogrzewanego stołu." +msgstr "Bieżąca temperatura podgrzewanego stołu." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:379 msgctxt "@tooltip of temperature input" @@ -2987,7 +2996,7 @@ msgstr "Podgrzewanie wstępne" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:600 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." -msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosować druk podczas nagrzewania i nie musisz czekać, aż stół będzie się rozgrzewać, gdy będziesz gotowy do drukowania." +msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosowywać druk podczas nagrzewania, a nie będziesz musiał czekać na rozgrzanie stołu, gdy będziesz gotowy do drukowania." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:633 msgctxt "@label" @@ -3027,12 +3036,12 @@ msgstr "&Ponów" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 msgctxt "@action:inmenu menubar:file" msgid "&Quit" -msgstr "&Wyjść" +msgstr "&Zamknij" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 msgctxt "@action:inmenu" msgid "Configure Cura..." -msgstr "Konfiguruj Cura ..." +msgstr "Konfiguruj Cura..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 msgctxt "@action:inmenu menubar:printer" @@ -3052,7 +3061,7 @@ msgstr "Zarządzaj materiałami ..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" -msgstr "&Aktualizuj profil z bieżącymi ustawieniami/przesłonami" +msgstr "&Aktualizuj profil z bieżącymi ustawieniami" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 msgctxt "@action:inmenu menubar:profile" @@ -3062,12 +3071,12 @@ msgstr "&Odrzuć bieżące zmiany" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." -msgstr "&Utwórz profil z bieżących ustawień/nadpisań ..." +msgstr "&Utwórz profil z bieżących ustawień..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." -msgstr "Zarządzaj profilami ..." +msgstr "Zarządzaj profilami..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 msgctxt "@action:inmenu menubar:help" @@ -3077,33 +3086,33 @@ msgstr "Pokaż dokumentację internetową" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" -msgstr "&Zgłoś błąd" +msgstr "Zgłoś błąd" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 msgctxt "@action:inmenu menubar:help" msgid "&About..." -msgstr "&Temat" +msgstr "&O..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Usuń &wybrany model" -msgstr[1] "Usuń &wybrany modele" +msgstr[1] "Usuń &wybrane modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" -msgstr[0] "Centrum wybranego modelu" -msgstr[1] "Centrum wybranego modeli" +msgstr[0] "Wyśrodkuj wybrany model" +msgstr[1] "Wyśrodkuj wybrane modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "Pomnożyć wybrany model" -msgstr[1] "Pomnożyć wybrany modele" +msgstr[0] "Rozmnóż wybrany model" +msgstr[1] "Rozmnóż wybrane modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 msgctxt "@action:inmenu" @@ -3113,17 +3122,17 @@ msgstr "Usuń model" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" -msgstr "Centruj model na platformie" +msgstr "Wyśrodkuj model na platformie" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" -msgstr "&Modele grupowe" +msgstr "&Grupuj modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" -msgstr "Modele grup " +msgstr "Rozgrupuj modele " #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 msgctxt "@action:inmenu menubar:edit" @@ -3133,7 +3142,7 @@ msgstr "&Połącz modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 msgctxt "@action:inmenu" msgid "&Multiply Model..." -msgstr "&Powielić modele" +msgstr "&Powiel model..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 msgctxt "@action:inmenu menubar:edit" @@ -3148,7 +3157,7 @@ msgstr "&Wyczyść stół" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" -msgstr "Odśwież wszystkie modele" +msgstr "Przeładuj wszystkie modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 msgctxt "@action:inmenu menubar:edit" @@ -3158,7 +3167,7 @@ msgstr "Ułóż wszystkie modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" -msgstr "Zorganizuj wybór" +msgstr "Wybór ułożenia" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 msgctxt "@action:inmenu menubar:edit" @@ -3168,12 +3177,12 @@ msgstr "Zresetuj wszystkie pozycje modelu" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" -msgstr "Zresetuj wszystkie modele i transformacje" +msgstr "Zresetuj wszystkie przekształcenia modelu" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." -msgstr "&Otwórz pliki ..." +msgstr "&Otwórz plik(i) ..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 msgctxt "@action:inmenu menubar:file" @@ -3183,7 +3192,7 @@ msgstr "&Nowy projekt..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." -msgstr "Pokaż silnik &dziennik ..." +msgstr "Pokaż &dziennik silnika..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 msgctxt "@action:inmenu menubar:help" @@ -3203,7 +3212,7 @@ msgstr "Proszę załaduj model 3d" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:33 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" -msgstr "Gotowy do wycinania" +msgstr "Gotowy do cięcia" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:35 msgctxt "@label:PrintjobStatus" @@ -3218,17 +3227,17 @@ msgstr "Gotowy do %1" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:39 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" -msgstr "Nie można zgrać" +msgstr "Nie można pociąć" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:41 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" -msgstr "Krojenie niedostępne" +msgstr "Cięcie niedostępne" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:148 msgctxt "@label:Printjob" msgid "Prepare" -msgstr "Przygotować" +msgstr "Przygotuj" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:148 msgctxt "@label:Printjob" @@ -3249,7 +3258,7 @@ msgstr "Otwórz plik(i)" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 msgctxt "@text:window" msgid "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?" -msgstr "Znaleziono jeden lub więcej plików projektu w wybranych plikach. Możesz otwierać tylko jeden plik projektu na raz. Proponujemy tylko importowanie modeli z tych plików. Chcesz kontynuować?" +msgstr "Znaleziono jeden lub więcej plików projektu w wybranych plikach. Możesz otwierać tylko jeden plik projektu na raz. Proponujemy importowanie tylko modeli z tych plików. Czy chcesz kontynuować?" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 msgctxt "@action:button" @@ -3311,12 +3320,12 @@ msgstr "&Materiał" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 msgctxt "@title:menu" msgid "&Profile" -msgstr "&Profile" +msgstr "&Profil" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 msgctxt "@action:inmenu" msgid "Set as Active Extruder" -msgstr "Ustaw jako aktywną głowice drukującą" +msgstr "Ustaw jako aktywną głowicę" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:185 msgctxt "@title:menu menubar:toplevel" @@ -3326,7 +3335,7 @@ msgstr "&Rozszerzenia" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:218 msgctxt "@title:menu menubar:toplevel" msgid "P&references" -msgstr "Pre&ferencje" +msgstr "Preferencje" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:226 msgctxt "@title:menu menubar:toplevel" @@ -3366,7 +3375,7 @@ msgstr "Otwórz plik(i)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." -msgstr "Znaleziono jeden lub więcej plików G-kod w wybranych plikach. Możesz otwierać tylko jeden plik G-kod jednocześnie. Jeśli chcesz otworzyć plik G-kod, wystarczy wybrać tylko jeden." +msgstr "Znaleziono jeden lub więcej plików G-code w wybranych plikach. Możesz otwierać tylko jeden plik G-code jednocześnie. Jeśli chcesz otworzyć plik G-code, proszę wybierz tylko jeden." #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 msgctxt "@title:window" @@ -3376,7 +3385,7 @@ msgstr "Zapisz projekt" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 msgctxt "@action:label" msgid "Extruder %1" -msgstr "Głowica drukująca %1" +msgstr "Ekstruder %1" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 msgctxt "@action:label" @@ -3386,7 +3395,7 @@ msgstr "%1 & materiał" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 msgctxt "@action:label" msgid "Don't show project summary on save again" -msgstr "Nie pokazuj podsumowania projektu w celu zapisania" +msgstr "Nie pokazuj podsumowania projektu podczas ponownego zapisywania" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:41 msgctxt "@label" @@ -3401,7 +3410,7 @@ msgstr "0%" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:195 msgctxt "@label" msgid "Empty infill will leave your model hollow with low strength." -msgstr "Pusty wkład wypełnia pusty model." +msgstr "Puste wypełnienie pozostawi twój model pusty z niską wytrzymałością" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:199 msgctxt "@label" @@ -3411,7 +3420,7 @@ msgstr "20%" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:206 msgctxt "@label" msgid "Light (20%) infill will give your model an average strength." -msgstr "Lekki (20%) wypełnienie sprawi, że model będzie średniej wytrzymałości." +msgstr "Lekkie (20%) wypełnienie sprawi, że model będzie średniej wytrzymałości." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:210 msgctxt "@label" @@ -3421,7 +3430,7 @@ msgstr "50%" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:217 msgctxt "@label" msgid "Dense (50%) infill will give your model an above average strength." -msgstr "Gęste wypełnienie (50%) da modelowi wyższą średnią wytrzymałość." +msgstr "Gęste wypełnienie (50%) da modelowi wyższą niż średnia wytrzymałość." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:221 msgctxt "@label" @@ -3431,7 +3440,7 @@ msgstr "100%" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:228 msgctxt "@label" msgid "Solid (100%) infill will make your model completely solid." -msgstr "Solidny (100%) wypełnienie sprawi, że model będzie solidny." +msgstr "Pełne (100%) wypełnienie sprawi, że model będzie całkowicie wypełniony." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:232 msgctxt "@label" @@ -3446,44 +3455,44 @@ msgstr "Stopniowe wypełnienie stopniowo zwiększa ilość wypełnień w górę. #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:263 msgctxt "@label" msgid "Generate Support" -msgstr "Wygeneruj podpory" +msgstr "Generuj podpory" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:296 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." -msgstr "Generowanie struktur wspierających części modelu, które mają zwis. Bez tych struktur takie części mogłyby spaść podczas drukowania." +msgstr "Generuje podpory wspierające części modelu, które mają zwis. Bez tych podpór takie części mogłyby spaść podczas drukowania." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:313 msgctxt "@label" msgid "Support Extruder" -msgstr "Wytłaczarka wspomagająca" +msgstr "Ekstruder od podpór" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:387 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." -msgstr "Wybrać, którą wytłaczarkę użyć do podparcia. Powoduje to tworzenie struktur wspierających poniżej modelu, aby zapobiec spadaniu lub drukowaniu modelu w powietrzu." +msgstr "Wybierz, który ekstruder ma służyć do drukowania podpór. Powoduje to tworzenie podpór poniżej modelu, aby zapobiec spadaniu lub drukowaniu modelu w powietrzu." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:412 msgctxt "@label" msgid "Build Plate Adhesion" -msgstr "Zbuduj przyczepnośćdo stołu" +msgstr "Popraw przycz. modelu" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:458 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." -msgstr "Włącz drukowanie obrysu lub tratwy. Spowoduje to dodanie płaskiej powierzchni wokół lub pod Twoim obiektem, która jest łatwa do wycinania później." +msgstr "Włącz drukowanie obrysu lub tratwy. Spowoduje to dodanie płaskiej powierzchni wokół lub pod Twoim obiektem, która jest łatwa do usunięcia po wydruku." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:511 msgctxt "@label" msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" -msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
Przeczytać Instrukcje dotyczące rozwiązywania problemów z Ultimaker" +msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
Przeczytaj instrukcje dotyczące rozwiązywania problemów" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label" msgid "Print Selected Model with %1" msgid_plural "Print Selected Models With %1" msgstr[0] "Wydrukuj wybrany model z %1" -msgstr[1] "Wydrukuj wybrany modele z %1" +msgstr[1] "Wydrukuj wybrane modele z %1" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 msgctxt "@title:window" @@ -3493,7 +3502,7 @@ msgstr "Otwórz plik projektu" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" -msgstr "Jest to plik projektu Cura. Czy chcesz otworzyć go jako projekt lub zaimportować z niego modele?" +msgstr "Jest to plik projektu Cura. Czy chcesz otworzyć go jako projekt, czy zaimportować z niego modele?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 msgctxt "@text:window" @@ -3524,12 +3533,12 @@ msgstr "Materiał" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:234 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." -msgstr "Kliknij, aby sprawdzić zgodność materiału z Ultimaker.com." +msgstr "Kliknij, aby sprawdzić zgodność materiału na Ultimaker.com." #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:321 msgctxt "@label" msgid "Profile:" -msgstr "Profile:" +msgstr "Profil:" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -3538,6 +3547,6 @@ msgid "" "\n" "Click to open the profile manager." msgstr "" -"Niektóre wartości ustawień / nadpisywania różnią się od wartości zapisanych w profilu.\n" +"Niektóre wartości ustawień różnią się od wartości zapisanych w profilu.\n" "\n" -"Kliknij, aby otworzyć menedżera profili." +"Kliknij, aby otworzyć menedżer profili." diff --git a/resources/i18n/pl/fdmextruder.def.json.po b/resources/i18n/pl/fdmextruder.def.json.po index 52ff4fc392..ead3e37bec 100644 --- a/resources/i18n/pl/fdmextruder.def.json.po +++ b/resources/i18n/pl/fdmextruder.def.json.po @@ -1,180 +1,159 @@ -# Cura JSON setting files -# Copyright (C) 2017 Ultimaker -# This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. -# msgid "" msgstr "" -"Project-Id-Version: Cura 2.6\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-07-13 16:08+0200\n" -"Last-Translator: jagus85\n" -"Language-Team: reprapy.pl\n" -"Language: Polish\n" -"Lang-Code: pl\n" -"Country-Code: PL\n" +"Project-Id-Version: Cura\n" +"Report-Msgid-Bugs-To: http://github.com/Ultimaker/Cura\n" +"POT-Creation-Date: 2017-03-27 17:27+0000\n" +"PO-Revision-Date: 2017-07-20 16:49+0200\n" +"Last-Translator: Automatically generated\n" +"Language-Team: Polish\n" +"Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 2.0.2\n" msgctxt "extruder_nr description" msgid "The extruder train used for printing. This is used in multi-extrusion." msgstr "" -"Urządzenie do drukowania stosuje się głowicę drukującą. Służy do multi-" +"Ekstruder używany do drukowania. Ta opcja używana jest podczas multi-" "ekstruzji." msgctxt "extruder_nr label" msgid "Extruder" -msgstr "Extruder" +msgstr "Ekstruder" msgctxt "extruder_prime_pos_x description" msgid "" "The X coordinate of the position where the nozzle primes at the start of " "printing." -msgstr "" -"Die X-Koordinate der Position, an der die Düse am Druckbeginn einzieht." +msgstr "Współrzędna X, w której dysza jest czyszczona na początku wydruku." msgctxt "extruder_prime_pos_x label" msgid "Extruder Prime X Position" -msgstr "X-Position Extruder-Einzug" +msgstr "Pozycja X Czyszczenia Dyszy" msgctxt "extruder_prime_pos_y description" msgid "" "The Y coordinate of the position where the nozzle primes at the start of " "printing." -msgstr "" -"Die Y-Koordinate der Position, an der die Düse am Druckbeginn einzieht." +msgstr "Współrzędna Y, w której dysza jest czyszczona na początku wydruku." msgctxt "extruder_prime_pos_y label" msgid "Extruder Prime Y Position" -msgstr "Y-Position Extruder-Einzug" +msgstr "Pozycja Y Czyszczenia Dyszy" msgctxt "extruder_prime_pos_z description" msgid "" "The Z coordinate of the position where the nozzle primes at the start of " "printing." -msgstr "" -"Die Z-Koordinate der Position, an der die Düse am Druckbeginn einzieht." +msgstr "Współrzędna Z, w której dysza jest czyszczona na początku wydruku." msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "Z-Position Extruder-Einzug" +msgstr "Pozycja Z Czyszczenia Dyszy" msgctxt "machine_extruder_end_code description" msgid "End g-code to execute whenever turning the extruder off." -msgstr "Beenden Sie den G-Code jedes Mal, wenn Sie den Extruder ausschalten." +msgstr "Końcowy G-code, który jest wywoływany, kiedy ekstruder jest wyłączany." msgctxt "machine_extruder_end_code label" msgid "Extruder End G-Code" -msgstr "G-Code Extruder-Ende" +msgstr "Końcowy G-code Ekstrudera" msgctxt "machine_extruder_end_pos_abs description" msgid "" "Make the extruder ending position absolute rather than relative to the last-" "known location of the head." msgstr "" -"Bevorzugen Sie eine absolute Endposition des Extruders anstelle einer " -"relativen Position zur zuletzt bekannten Kopfposition." +"Zmień pozycję końcową ekstrudera na bezwzględną, zamiast względem ostatniej " +"pozycji głowicy." msgctxt "machine_extruder_end_pos_abs label" msgid "Extruder End Position Absolute" -msgstr "Pozycja końca absolutnym głowicy drukującej" +msgstr "Bezwzgl. Końcowa Pozycja Ekstrudera" msgctxt "machine_extruder_end_pos_x description" msgid "The x-coordinate of the ending position when turning the extruder off." -msgstr "Die X-Koordinate der Endposition beim Ausschalten des Extruders." +msgstr "Współrzędna X końcowej pozycji ekstrudera podczas jego wyłączania." msgctxt "machine_extruder_end_pos_x label" msgid "Extruder End Position X" -msgstr "Extruder-Endposition X" +msgstr "Końcowa Pozycja X Ekstrudera" msgctxt "machine_extruder_end_pos_y description" msgid "The y-coordinate of the ending position when turning the extruder off." -msgstr "Die Y-Koordinate der Endposition beim Ausschalten des Extruders." +msgstr "Współrzędna Y końcowej pozycji ekstrudera podczas jego wyłączania." msgctxt "machine_extruder_end_pos_y label" msgid "Extruder End Position Y" -msgstr "Extruder-Endposition Y" +msgstr "Końcowa Pozycja Y Ekstrudera" msgctxt "machine_extruder_start_code description" msgid "Start g-code to execute whenever turning the extruder on." -msgstr "Zacznij każdym razem, gdy G-kod po włączeniu wytłaczarki." +msgstr "Początkowy G-code wywoływany kiedy ekstruder uruchamia się." msgctxt "machine_extruder_start_code label" msgid "Extruder Start G-Code" -msgstr "G-kodu startowego głowicy drukującej" +msgstr "Początkowy G-code Ekstrudera" msgctxt "machine_extruder_start_pos_abs description" msgid "" "Make the extruder starting position absolute rather than relative to the " "last-known location of the head." msgstr "" -"Bevorzugen Sie eine absolute Startposition des Extruders anstelle einer " -"relativen Position zur zuletzt bekannten Kopfposition." +"Zmień pozycję początkową ekstrudera na bezwzględną, zamiast względem " +"ostatniej pozycji głowicy." msgctxt "machine_extruder_start_pos_abs label" msgid "Extruder Start Position Absolute" -msgstr "Absolutną pozycję wyjściową wytłaczarki" +msgstr "Bezwzględna Pozycja Początkowa Ekstrudera" msgctxt "machine_extruder_start_pos_x description" msgid "The x-coordinate of the starting position when turning the extruder on." -msgstr "Die X-Koordinate der Startposition beim Einschalten des Extruders." +msgstr "Współrzędna X początkowej pozycji ekstrudera podczas jego włączania." msgctxt "machine_extruder_start_pos_x label" msgid "Extruder Start Position X" -msgstr "X-Position Extruder-Start" +msgstr "Początkowa Pozycja X Ekstrudera" msgctxt "machine_extruder_start_pos_y description" msgid "The y-coordinate of the starting position when turning the extruder on." -msgstr "Die Y-Koordinate der Startposition beim Einschalten des Extruders." +msgstr "Współrzędna Y początkowej pozycji ekstrudera podczas jego włączania." msgctxt "machine_extruder_start_pos_y label" msgid "Extruder Start Position Y" -msgstr "Y-Position Extruder-Start" +msgstr "Początkowa Pozycja Y Ekstrudera" msgctxt "machine_nozzle_offset_x description" msgid "The x-coordinate of the offset of the nozzle." -msgstr "Współrzędnej X podziałki dysz." +msgstr "Współrzędna X przesunięcia dyszy." msgctxt "machine_nozzle_offset_x label" msgid "Nozzle X Offset" -msgstr "X przesunięcie dyszy" +msgstr "Przesunięcie X Dyszy" msgctxt "machine_nozzle_offset_y description" msgid "The y-coordinate of the offset of the nozzle." -msgstr "Współrzędnej Y podziałki dysz." +msgstr "Współrzędna Y przesunięcia dyszy." msgctxt "machine_nozzle_offset_y label" msgid "Nozzle Y Offset" -msgstr "Y przesunięcie dyszę" - -msgctxt "machine_nozzle_size description" -msgid "" -"The inner diameter of the nozzle. Change this setting when using a non-" -"standard nozzle size." -msgstr "" -"Wewnętrzna średnica dyszy. Użyj tego ustawienia, jeśli używasz dyszę o " -"niestandardowym rozmiarze." - -msgctxt "machine_nozzle_size label" -msgid "Nozzle Diameter" -msgstr "średnica dyszy" +msgstr "Przesunięcie Y Dyszy" msgctxt "machine_settings description" msgid "Machine specific settings" -msgstr "Ustawienia specyficzne dla urządzenia" +msgstr "Specyficzne ustawienia maszyny" msgctxt "machine_settings label" msgid "Machine" -msgstr "urządzenie" +msgstr "Maszyna" msgctxt "platform_adhesion description" msgid "Adhesion" -msgstr "odpowiedzialność" +msgstr "Przyczepność" msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "Druckplattenhaftung" +msgstr "Przyczepność do stołu" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index f665b89b68..2b503432bb 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -1,24 +1,18 @@ -# Cura JSON setting files -# Copyright (C) 2017 Ultimaker -# This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. -# msgid "" msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-07-17 01:20+0200\n" -"Last-Translator: jagus85\n" -"Language-Team: reprapy.pl\n" -"Language: Polish\n" -"Lang-Code: pl\n" -"Country-Code: PL\n" +"PO-Revision-Date: 2017-07-24 11:51+0200\n" +"Last-Translator: Bothof \n" +"Language-Team: Polish\n" +"Language: pl_PL\n" +"Lang-Code: de\n" +"Country-Code: DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.2\n" +"X-Generator: Poedit 2.0.3\n" msgctxt "acceleration_enabled description" msgid "" @@ -30,15 +24,15 @@ msgstr "" msgctxt "acceleration_enabled label" msgid "Enable Acceleration Control" -msgstr "Włącz sterowanie przyspieszeniem" +msgstr "Włącz Sterowanie Przyspieszeniem" msgctxt "acceleration_infill description" msgid "The acceleration with which infill is printed." -msgstr "Przyspieszenie z którym wypełnienie jest drukowane." +msgstr "Przyspieszenie, z którym drukowane jest wypełnienie." msgctxt "acceleration_infill label" msgid "Infill Acceleration" -msgstr "Przyspieszenie wypełnienia" +msgstr "Przyspieszenie Wypełnienia" msgctxt "acceleration_layer_0 description" msgid "The acceleration for the initial layer." @@ -50,11 +44,11 @@ msgstr "Pierwsza warstwa przyspieszenie" msgctxt "acceleration_prime_tower description" msgid "The acceleration with which the prime tower is printed." -msgstr "Przyspieszenie, z którym drukowana jest pierwszorzędna wieża." +msgstr "Przyspieszenie, z którym drukowana jest wieża czyszcząca." msgctxt "acceleration_prime_tower label" msgid "Prime Tower Acceleration" -msgstr "Przyspieszenie pierwszorzędnej wieży." +msgstr "Przyspieszenie Wieży Czyszczącej" msgctxt "acceleration_print description" msgid "The acceleration with which printing happens." @@ -62,7 +56,7 @@ msgstr "Przyspieszenie, z jakim odbywa się drukowanie." msgctxt "acceleration_print label" msgid "Print Acceleration" -msgstr "Przyspieszenie druku (Acceleration)" +msgstr "Przyspieszenie Druku" msgctxt "acceleration_print_layer_0 description" msgid "The acceleration during the printing of the initial layer." @@ -70,7 +64,7 @@ msgstr "Przyspieszenie podczas drukowania pierwszej warstwy." msgctxt "acceleration_print_layer_0 label" msgid "Initial Layer Print Acceleration" -msgstr "Początkowe przyspieszenie drukowania warstw" +msgstr "Przysp. Druku 1. Warstwy" msgctxt "acceleration_skirt_brim description" msgid "" @@ -78,127 +72,125 @@ msgid "" "done with the initial layer acceleration, but sometimes you might want to " "print the skirt or brim at a different acceleration." msgstr "" -"Przyspieszenia, z którymi Skirt- i brzegi-elementy druku. Typowo, następuje " -"przyspieszenie warstwy bazowej używany. W niektórych przypadkach może być " -"korzystne, jednak, aby wydrukować Skirt- lub Brim elementu z innym " -"przyspieszenia." +"Przyspieszenie z jakim drukowane są obwódka i obrys. Normalnie są one " +"drukowane z przyspieszeniem pierwszej warstwy, ale czasami będziesz chciał " +"wydrukować obwódkę i obrys z innym przyspieszeniem." msgctxt "acceleration_skirt_brim label" msgid "Skirt/Brim Acceleration" -msgstr "Przyspieszenie Skirt / Brim" +msgstr "Przyspieszenie Obwódki/Obrysu" msgctxt "acceleration_support description" msgid "The acceleration with which the support structure is printed." -msgstr "Przyspieszenie z której konstrukcja nośna jest drukowana." +msgstr "Przyspieszenie, z którym drukowane są podpory." msgctxt "acceleration_support label" msgid "Support Acceleration" -msgstr "Konstrukcja podpór przyspieszenie" +msgstr "Przyspieszenie Podpór" msgctxt "acceleration_support_bottom description" msgid "" "The acceleration with which the floors of support are printed. Printing them " "at lower acceleration can improve adhesion of support on top of your model." msgstr "" -"Przyspieszenie, z jakim są drukowane podłoża. Drukowanie przy niższym " -"przyspieszeniu może poprawić adhezję wsparcia nad modelem." +"Przyspieszenie, z jakim są drukowane podłoża podpór. Drukowanie przy niższym " +"przyspieszeniu może poprawić adhezję podpory na modelu." msgctxt "acceleration_support_bottom label" msgid "Support Floor Acceleration" -msgstr "Przyspieszenie struktury podłoża" +msgstr "Przyspieszenie Podłoża Podpory" msgctxt "acceleration_support_infill description" msgid "The acceleration with which the infill of support is printed." -msgstr "" -"Przyspieszenie z których wypełnienie konstrukcji nośnej jest drukowane." +msgstr "Przyspieszenie, z których drukowane jest wypełnienie podpory." msgctxt "acceleration_support_infill label" msgid "Support Infill Acceleration" -msgstr "Przyspieszenie struktury wsparcia wypełnienia." +msgstr "Przyspieszenie Wypełnienia Podpory" msgctxt "acceleration_support_interface description" msgid "" "The acceleration with which the roofs and floors of support are printed. " "Printing them at lower acceleration can improve overhang quality." msgstr "" -"Przyspieszenie, z jaką są drukowane dachy i podłogi podpory. Drukowanie przy " -"niższym przyspieszeniu może poprawić jakość zwisu." +"Przyspieszenie, z jakim drukowane są dachy i podłoża podpory. Drukowanie " +"przy niższym przyspieszeniu może poprawić jakość zwisu." msgctxt "acceleration_support_interface label" msgid "Support Interface Acceleration" -msgstr "Przyspieszenie interfejs konstrukcja nośna" +msgstr "Przyspieszenie Pow. Styku Podpory" msgctxt "acceleration_support_roof description" msgid "" "The acceleration with which the roofs of support are printed. Printing them " "at lower acceleration can improve overhang quality." msgstr "" -"Przyspieszenia, z którymi dachów konstrukcji nośnej do wydrukowania. " -"Drukując na niższym przyspieszeniem, jakość wystające może być poprawiona." +"Przyspieszenie, z jakim drukowane są dachy podpór. Drukowanie przy niższym " +"przyspieszeniu może poprawić jakość zwisu." msgctxt "acceleration_support_roof label" msgid "Support Roof Acceleration" -msgstr "Konstrukcja dachu przyspieszenie" +msgstr "Przyspieszenie Dachu Podpory" msgctxt "acceleration_topbottom description" msgid "The acceleration with which top/bottom layers are printed." -msgstr "Przyspieszenie w którym górne / dolne warstwy druku." +msgstr "Przyspieszenie, z jakim drukowane są górne/dolne warstwy." msgctxt "acceleration_topbottom label" msgid "Top/Bottom Acceleration" -msgstr "Przyspieszenie w górę / w dół" +msgstr "Przysp. Górnych/Dolnych Warstw" msgctxt "acceleration_travel description" msgid "The acceleration with which travel moves are made." -msgstr "Przyspieszenie, z jaką wykonywane są przemieszczenia." +msgstr "Przyspieszenie, z jakim wykonywane są ruchy jałowe." msgctxt "acceleration_travel label" msgid "Travel Acceleration" -msgstr "Przyspieszenie podróży" +msgstr "Przyspieszenie Ruchów Jałowych" msgctxt "acceleration_travel_layer_0 description" msgid "The acceleration for travel moves in the initial layer." -msgstr "Przyspieszenie ruchu napędu pierwszej warstwy." +msgstr "Przyspieszenie ruchów jałowych na pierwszej warstwie." msgctxt "acceleration_travel_layer_0 label" msgid "Initial Layer Travel Acceleration" -msgstr "Prędkość ruchu dla pierwszej warstwy" +msgstr "Przyspieszenie Ruchu Jał. 1. Warstwa" msgctxt "acceleration_wall description" msgid "The acceleration with which the walls are printed." -msgstr "Przyspieszenie z którym ściany są drukowane." +msgstr "Przyspieszenie, z jakim drukowane są ściany." msgctxt "acceleration_wall label" msgid "Wall Acceleration" -msgstr "Przyspieszenie ściany" +msgstr "Przyspieszenie Ścian" msgctxt "acceleration_wall_0 description" msgid "The acceleration with which the outermost walls are printed." -msgstr "Przyspieszenia, z którym ściany zewnętrzne są drukowane." +msgstr "Przyspieszenia, z jakim drukowane są ściany zewn." msgctxt "acceleration_wall_0 label" msgid "Outer Wall Acceleration" -msgstr "Przyspieszenie zewnętrzna ściana" +msgstr "Przyspieszenie Ściany Zewn." msgctxt "acceleration_wall_x description" msgid "The acceleration with which all inner walls are printed." -msgstr "Przyspieszenie z których wewnętrzne ścianki są drukowane." +msgstr "Przyspieszenie, z jakim drukowane są ściany wewn." msgctxt "acceleration_wall_x label" msgid "Inner Wall Acceleration" -msgstr "Przyspieszenie wewnętrzna ściana" +msgstr "Przyspieszenie Ściany Wewn." msgctxt "adhesion_extruder_nr description" msgid "" "The extruder train to use for printing the skirt/brim/raft. This is used in " "multi-extrusion." msgstr "" -"Element wytłaczarki do drukowania Obwódki / Obrzeża / Tratwy. Służy do multi-" +"Ekstruder używany do drukowania obwódki/obrysu/tratwy. Używane przy multi-" "ekstruzji." msgctxt "adhesion_extruder_nr label" msgid "Build Plate Adhesion Extruder" -msgstr "Wytłaczarka do wytłaczania płyt warstwowych" +msgstr "Ekstruder Drukujący Ułatw. Przyczep." msgctxt "adhesion_type description" msgid "" @@ -208,23 +200,22 @@ msgid "" "below the model. Skirt is a line printed around the model, but not connected " "to the model." msgstr "" -"Różne opcje, które pomogą poprawić zarówno wypalanie wytłoczenia, jak i " -"przyczepność do płytki. Brim dodaje jednowarstwową płaską powierzchnię wokół " -"podstawy modelu, aby zapobiec wypaczeniu. Raft dodaje grubą siatkę z dachem " -"poniżej modelu. Spódnica to linia nadrukowana wokół modelu, ale nie " -"połączona z modelem." +"Różne opcje, które pomagają na przyczepność do stołu. Obrys dodaje " +"jednowarstwową płaską powierzchnię wokół podstawy modelu, aby zapobiec " +"wypaczeniu. Tratwa dodaje grubą siatkę z dachem poniżej modelu. Obwódka to " +"linia nadrukowana wokół modelu, ale nie połączona z modelem." msgctxt "adhesion_type label" msgid "Build Plate Adhesion Type" -msgstr "Podaj typ przyczepności płyty" +msgstr "Typ Ulepszenia Przyczepności" msgctxt "adhesion_type option brim" msgid "Brim" -msgstr "Obrzeże/Brim" +msgstr "Obrys" msgctxt "adhesion_type option none" msgid "None" -msgstr "Żaden" +msgstr "Brak" msgctxt "adhesion_type option raft" msgid "Raft" @@ -232,7 +223,7 @@ msgstr "Tratwa" msgctxt "adhesion_type option skirt" msgid "Skirt" -msgstr "Obwódka/Skirt" +msgstr "Obwódka" msgctxt "alternate_carve_order description" msgid "" @@ -241,82 +232,83 @@ msgid "" "cause one of the meshes to obtain all of the volume in the overlap, while it " "is removed from the other meshes." msgstr "" -"Przełączanie, w które będą się przecinały siatki, będą przychodzić z każdą " -"warstwą, tak, aby zachodzące na siebie siatki się wzajemnie splatały. " -"Wyłączenie tej opcji spowoduje, że jeden z oczek będzie mógł pobrać całą " -"objętość na zakładce, podczas gdy jest usuwany z innych oczek." +"Przełącz się, to której przecinającej się siatki będą należały z każdą " +"warstwą, tak że nakładające się siatki przeplatają się. Wyłączenie tej opcji " +"spowoduje, że jedna siatka uzyska całą objętość podczas nakładania się, " +"kiedy jest usunięta z pozostałych siatek." msgctxt "alternate_carve_order label" msgid "Alternate Mesh Removal" -msgstr "Zmiana usunięcie sieci" +msgstr "Zastosuj Usuwanie Siatki" msgctxt "alternate_extra_perimeter description" msgid "" "Prints an extra wall at every other layer. This way infill gets caught " "between these extra walls, resulting in stronger prints." msgstr "" -"W ten sposób wypełnienie zostaje złapane między tymi dodatkowymi ścianami, " -"powodując silniejsze odruchy." +"Drukuje dodatkową ścianę na każdej warstwie. W ten sposób wypełnienie jest " +"tworzone pomiędzy tymi dod. ścianami, co skutkuje mocniejszymi wydrukami." msgctxt "alternate_extra_perimeter label" msgid "Alternate Extra Wall" -msgstr "Alternatywna dodatkowa ściana" +msgstr "Zastosuj Dodatkową Ścianę" msgctxt "anti_overhang_mesh description" msgid "" "Use this mesh to specify where no part of the model should be detected as " "overhang. This can be used to remove unwanted support structure." msgstr "" -"Sieć ta służy do określenia, która część modelu ma być rozpoznany jako zwis. " -"Może być stosowany do usuwania niechcianych konstrukcję nośną." +"Użyj tej siatki, aby sprecyzować gdzie żadna z części modelu nie powinna być " +"wykrywana jako zwis. Ta opcja może być używana do usuwania niepotrzebnych " +"podpór." msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" -msgstr "Anti-zwis sieć" +msgstr "Siatka Anty-zwisowa" msgctxt "blackmagic description" msgid "category_blackmagic" -msgstr "Czarna magia kategorii" +msgstr "category_blackmagic" msgctxt "blackmagic label" msgid "Special Modes" -msgstr "Specjalne tryby" +msgstr "Specjalne Tryby" msgctxt "bottom_layers description" msgid "" "The number of bottom layers. When calculated by the bottom thickness, this " "value is rounded to a whole number." msgstr "" -"Liczba warstw dolnych. Przy obliczaniu dolnej grubości ta wartość jest " +"Liczba dolnych warstw. Przy obliczaniu grubości dołu ta wartość jest " "zaokrąglana do liczby całkowitej." msgctxt "bottom_layers label" msgid "Bottom Layers" -msgstr "Dolne warstwy" +msgstr "Dolne Warstwy" msgctxt "bottom_thickness description" msgid "" "The thickness of the bottom layers in the print. This value divided by the " "layer height defines the number of bottom layers." msgstr "" -"Grubość dolnych warstw w druku. Ta wartość podzielona przez wysokość warstwy " -"definiuje liczbę warstw dolnych." +"Grubość dolnych warstw w wydruku. Ta wartość podzielona przez wysokość " +"warstwy definiuje liczbę warstw dolnych." msgctxt "bottom_thickness label" msgid "Bottom Thickness" -msgstr "Redukcja grubości" +msgstr "Grubość Dołu" msgctxt "brim_line_count description" msgid "" "The number of lines used for a brim. More brim lines enhance adhesion to the " "build plate, but also reduces the effective print area." msgstr "" -"Liczba linii dla elementu obrzeży. Większa liczba obrzeży linii poprawia " -"przyczepność do stołu ale to również zmniejsza powierzchnię użytkową druku." +"Liczba linii używana dla obrysu. Więcej linii obrysu poprawia przyczepność " +"do stołu, ale zmniejsza rzeczywiste pole wydruku." msgctxt "brim_line_count label" msgid "Brim Line Count" -msgstr "Liczba linii obrzeża" +msgstr "Liczba Linii Obrysu" msgctxt "brim_outside_only description" msgid "" @@ -324,13 +316,13 @@ msgid "" "brim you need to remove afterwards, while it doesn't reduce the bed adhesion " "that much." msgstr "" -"Obrzeże drukować tylko na zewnątrz modelu. Daje to liczbę ronda, które " -"trzeba usunąć później, podczas drukowania pole stołu jest znacznie " -"ograniczone zmniejszone." +"Drukuj obrys tylko na zewnątrz modelu. Zmniejsza to liczbę obrysu, który " +"trzeba usunąć po wydruku, podczas gdy nie zmniejsza znacząco przyczepności " +"do stołu." msgctxt "brim_outside_only label" msgid "Brim Only on Outside" -msgstr "Obrzeża tylko na zewnątrz" +msgstr "Obrys Tylko na Zewn." msgctxt "brim_width description" msgid "" @@ -338,38 +330,37 @@ msgid "" "enhances adhesion to the build plate, but also reduces the effective print " "area." msgstr "" -"Odległość od modelu do najbardziej wysuniętej na zewnątrz linii. Większy " -"obwód zwiększa adhezję do płytki, ale również zmniejsza efektywny obszar " -"wydruku." +"Odległość od modelu do najbardziej wysuniętej na zewnątrz linii obrysu. " +"Większy obrys zwiększa adhezję do stołu, ale również zmniejsza efektywny " +"obszar wydruku." msgctxt "brim_width label" msgid "Brim Width" -msgstr "Szerokość Obrzeża/Brim" +msgstr "Szerokość Obrysu" msgctxt "carve_multiple_volumes description" msgid "" "Remove areas where multiple meshes are overlapping with each other. This may " "be used if merged dual material objects overlap with each other." msgstr "" -"Obszarach poza, w którym wiele sieci pokrywają się ze sobą. To mogą być " -"stosowane, gdy montowane przedmioty z dwóch rodzajów materiału zachodzą na " -"siebie." +"Usuń obszary gdzie kilka siatek nakłada się na siebie. Może zostać użyte, " +"jeżeli dwa obiekty do druku 2 materiałami nachodzą na siebie." msgctxt "carve_multiple_volumes label" msgid "Remove Mesh Intersection" -msgstr "Usuń przecięcie siatki" +msgstr "Usuń Przecięcia Siatki" msgctxt "center_object description" msgid "" "Whether to center the object on the middle of the build platform (0,0), " "instead of using the coordinate system in which the object was saved." msgstr "" -"Czy środek obiektu znajduje się na środku platformy kompilacji (0,0), " -"zamiast używać układu współrzędnych, w którym został zapisany obiekt." +"Czy wyśrodkować obiekt na środku stołu (0,0), zamiast używać układu " +"współrzędnych, w którym został zapisany obiekt." msgctxt "center_object label" msgid "Center object" -msgstr "Środek obiektu" +msgstr "Wyśrodkuj Obiekt" msgctxt "coasting_enable description" msgid "" @@ -377,13 +368,13 @@ msgid "" "oozed material is used to print the last piece of the extrusion path in " "order to reduce stringing." msgstr "" -"Coasting zastępuje ostatnią część ścieżki wytłaczania ścieżką. Zużyty " -"materiał jest używany do drukowania ostatniego kawałka ścieżki wytłaczania w " -"celu zmniejszenia strun." +"Wypływanie zastępuje ostatnią część ścieżki ekstruzji, ścieżką ruchu " +"jałowego. Wyciekający materiał jest używany do wydrukowania ostatniego " +"fragmentu ekstruzji, aby zmniejszyć nitkowanie." msgctxt "coasting_enable label" msgid "Enable Coasting" -msgstr "Włącz (Coasting)" +msgstr "Włącz Wypływanie" msgctxt "coasting_min_volume description" msgid "" @@ -392,14 +383,15 @@ msgid "" "tube and so the coasted volume is scaled linearly. This value should always " "be larger than the Coasting Volume." msgstr "" -"Najmniejsza objętość ścieżka wytłaczania powinna mieć przed umożliwieniem " -"wypłynięcia. W przypadku małych ścieżek wytłaczania w rurce bowden powstało " -"mniejsze ciśnienie, a więc objętość rozbłysku jest skalowana liniowo. Ta " -"wartość powinna zawsze być większa niż objętość przybrzeżna." +"Najmniejsza objętość jaką powinna mieć ścieżka ekstruzji przed pozwoleniem " +"na Wypływanie. Dla mniejszych ścieżek ekstruzji pojawia się mniejsze " +"ciśnienie we wbudowanej rurce bowden dzięki czemu ilość wypływającego " +"materiału jest skalowana liniowo. Ta wartość powinna zawsze być większa niż " +"Objętość Wypływania." msgctxt "coasting_min_volume label" msgid "Minimum Volume Before Coasting" -msgstr "Minimalna objętość przed brzegiem" +msgstr "Minimalna Objętość Przed Wypływaniem" msgctxt "coasting_speed description" msgid "" @@ -407,25 +399,25 @@ msgid "" "extrusion path. A value slightly under 100% is advised, since during the " "coasting move the pressure in the bowden tube drops." msgstr "" -"Prędkość poruszania się podczas wybiegu, w stosunku do prędkości ścieżki " -"wytłaczania. Zaleca się wartość nieco poniżej 100%, ponieważ podczas ruchu " -"na brzegach ciśnienie w rurce bowden spada." +"Prędkość poruszania się podczas Wypływania, w stosunku do prędkości ścieżki " +"ekstruzji. Zaleca się wartość nieco poniżej 100%, ponieważ podczas " +"Wypływania ciśnienie w rurce bowden spada." msgctxt "coasting_speed label" msgid "Coasting Speed" -msgstr "Prędkość wybrzeża" +msgstr "Prędkość Wypływania" msgctxt "coasting_volume description" msgid "" "The volume otherwise oozed. This value should generally be close to the " "nozzle diameter cubed." msgstr "" -"Objętość została inna. Wartość ta powinna być zasadniczo zbliżona do " -"sześciennej średnicy dyszy." +"Objętość materiału wyciekającego jest inna. Wartość ta powinna być " +"zasadniczo zbliżona do średnicy dyszy do sześcianu." msgctxt "coasting_volume label" msgid "Coasting Volume" -msgstr "Objętość przybrzeżna" +msgstr "Objętość Wypływania" msgctxt "command_line_settings description" msgid "" @@ -433,11 +425,11 @@ msgid "" "frontend." msgstr "" "Ustawienia, które są używane tylko wtedy, gdy CuraEngine nie jest wywoływana " -"z frontu Cura." +"przez frontend Cura." msgctxt "command_line_settings label" msgid "Command Line Settings" -msgstr "Ustawienia wiersza polecenia" +msgstr "Ustawienia Wiersza Polecenia" msgctxt "conical_overhang_angle description" msgid "" @@ -445,13 +437,13 @@ msgid "" "value of 0° all overhangs are replaced by a piece of model connected to the " "build plate, 90° will not change the model in any way." msgstr "" -"Maksymalny kąt zwisów po ich nadrukowaniu. Przy wartości 0 ° wszystkie zwisy " -"są zastępowane przez wzór modelu połączony z płytą konstrukcyjną, a 90 ° w " -"żaden sposób nie zmienia modelu." +"Maksymalny kąt zwisów po którym będą one drukowalne. Przy wartości 0 ° " +"wszystkie zwisy są zastępowane przez fragment modelu połączony ze stołem, a " +"90 ° w żaden sposób nie zmienia modelu." msgctxt "conical_overhang_angle label" msgid "Maximum Model Angle" -msgstr "Maksymalny kąt modelu" +msgstr "Maksymalny Kąt Modelu" msgctxt "conical_overhang_enabled description" msgid "" @@ -459,26 +451,25 @@ msgid "" "required. Steep overhangs will become shallow overhangs. Overhanging areas " "will drop down to become more vertical." msgstr "" -"Zmień geometrię drukowanego modelu tak, aby wymagało minimalnego podparcia. " -"Strome zwisanie staną się płytkimi zwisami. Powtórne obszary spadną, aby " -"stać się bardziej pionowe." +"Zmienia geometrię modelu tak, aby wymagał minimalnego podparcia. Strome " +"zwisy staną się mniej strome. Zwisające obszary zostaną opuszczone by być " +"bardziej pionowymi." msgctxt "conical_overhang_enabled label" msgid "Make Overhang Printable" -msgstr "Dokonać nawisy do druku" +msgstr "Drukowalne Zwisy" msgctxt "cool_fan_enabled description" msgid "" "Enables the print cooling fans while printing. The fans improve print " "quality on layers with short layer times and bridging / overhangs." msgstr "" -"Umożliwia rozruch wentylatorom drukującym podczas drukowania. Wentylatory " -"poprawiają jakość wydruku na warstwach o krótkich czasach warstwy i " -"mostkach / zwisach." +"Włącza wentylatory chłodzące wydruk. Wentylatory poprawiają jakość wydruku " +"na warstwach o krótkim czasie druku warstwy i mostów/zwisów." msgctxt "cool_fan_enabled label" msgid "Enable Print Cooling" -msgstr "Włącz chłodzenie wydruku" +msgstr "Włącz Chłodzenie Wydruku" msgctxt "cool_fan_full_at_height description" msgid "" @@ -486,34 +477,34 @@ msgid "" "the fan speed gradually increases from Initial Fan Speed to Regular Fan " "Speed." msgstr "" -"Wysokość, na jaką wirują wentylatorki na regularnej prędkości wentylatora. W " -"warstwach poniżej prędkości wentylatora stopniowo wzrasta od początkowej " -"prędkości wentylatora do stałej prędkości wentylatora." +"Wysokość na jakiej wentylatory będą obracać się z regularną prędkością. Na " +"niższych warstwach prędkość wentylatorów będzie stopniowo zwiększać się z " +"Początk. Pręd. Wentylatora do Regularnej Pręd. Wentylatora." msgctxt "cool_fan_full_at_height label" msgid "Regular Fan Speed at Height" -msgstr "Normalna prędkość wentylatora na wysokości" +msgstr "Regularna Pręd. Went. na Wysokości" msgctxt "cool_fan_full_layer description" msgid "" "The layer at which the fans spin on regular fan speed. If regular fan speed " "at height is set, this value is calculated and rounded to a whole number." msgstr "" -"Warstwa, w której wirują wentylatorki o regularnej prędkości wentylatora. " -"Jeśli ustawiona jest regularna prędkość wentylatora na wysokości, wartość ta " -"jest obliczana i zaokrąglana na cały numer." +"Warstwa, na której wentylatory obracają się z normalną prędkością. Jeśli " +"ustawiona jest Regularna Pręd. Went. na Wysokości, wartość ta jest obliczana " +"i zaokrąglana do liczby całkowitej." msgctxt "cool_fan_full_layer label" msgid "Regular Fan Speed at Layer" -msgstr "Normalna prędkość obrotową wentylatora w warstwie" +msgstr "Regularna Pręd. Went. na Wartswie" msgctxt "cool_fan_speed description" msgid "The speed at which the print cooling fans spin." -msgstr "Prędkość obrotowa wentylatorów drukujących." +msgstr "Prędkość z jaką mają obracać się wentylatory." msgctxt "cool_fan_speed label" msgid "Fan Speed" -msgstr "Prędkość wiatraka" +msgstr "Prędkość Wentylatora" msgctxt "cool_fan_speed_0 description" msgid "" @@ -521,13 +512,13 @@ msgid "" "layers the fan speed is gradually increased up to the layer corresponding to " "Regular Fan Speed at Height." msgstr "" -"Prędkość, z jaką wentylatory wirują na początku druku. W kolejnych warstwach " -"prędkość wentylatora stopniowo wzrasta do warstwy odpowiadającej regularnej " -"prędkości wentylatora na wysokości." +"Prędkość, z jaką wentylatory obracają się na początku druku. W kolejnych " +"warstwach prędkość wentylatora stopniowo wzrasta do warstwy odpowiadającej " +"Regularnej Pręd. Went. na Wysokości." msgctxt "cool_fan_speed_0 label" msgid "Initial Fan Speed" -msgstr "Początkowa prędkość wentylatora" +msgstr "Początkowa Prędk. Wentylatora" msgctxt "cool_fan_speed_max description" msgid "" @@ -535,13 +526,14 @@ msgid "" "gradually increases between the regular fan speed and maximum fan speed when " "the threshold is hit." msgstr "" -"Prędkość, z jaką wirują wentylatory w minimalnym czasie warstwy. Prędkość " -"wentylatora stopniowo wzrasta między regularną prędkością wentylatora a " -"maksymalną prędkością wentylatora, gdy próg zostanie uderzony." +"Prędkość, z jaką obracają się wentylatory w minimalnym czasie warstwy. " +"Prędkość wentylatora stopniowo wzrasta między regularną prędkością " +"wentylatora a maksymalną prędkością wentylatora, kiedy próg zostanie " +"przekroczony." msgctxt "cool_fan_speed_max label" msgid "Maximum Fan Speed" -msgstr "Maksymalna prędkość wentylatora" +msgstr "Maksymalna Pręd. Wentylatora" msgctxt "cool_fan_speed_min description" msgid "" @@ -549,13 +541,13 @@ msgid "" "prints faster than the threshold, the fan speed gradually inclines towards " "the maximum fan speed." msgstr "" -"Prędkość obrotowa wentylatorów przed naciśnięciem progu. Kiedy warstwa jest " -"drukowana szybciej niż próg, prędkość wentylatora stopniowo spada do " -"maksymalnej prędkości wentylatora." +"Prędkość obrotowa wentylatorów przed osiągnięciem progu. Kiedy warstwa " +"drukowana jest szybciej niż próg, prędkość wentylatora stopniowo przybliża " +"się do maksymalnej prędkości wentylatora." msgctxt "cool_fan_speed_min label" msgid "Regular Fan Speed" -msgstr "Normalna prędkość wentylatora" +msgstr "Normalna Pręd. Wentylatora" msgctxt "cool_lift_head description" msgid "" @@ -563,13 +555,13 @@ msgid "" "away from the print and wait the extra time until the minimum layer time is " "reached." msgstr "" -"Jeśli zostanie osiągnięta minimalna prędkość ze względu na czas minimalnej " -"warstwy, głowica drukująca jest podnoszony przez ciśnienie i dodatkowego " -"czasu, aż zostanie osiągnięty minimalny czas na warstwy, czekając." +"Jeśli zostanie osiągnięta minimalna prędkość ze względu na minimalny czas " +"warstwy, podnieś głowicę poza wydruk i poczekaj aż zostanie osiągnięty " +"minimalny czas warstwy." msgctxt "cool_lift_head label" msgid "Lift Head" -msgstr "Unieść głowicę" +msgstr "Unieś Głowicę" msgctxt "cool_min_layer_time description" msgid "" @@ -579,15 +571,15 @@ msgid "" "still take shorter than the minimal layer time if Lift Head is disabled and " "if the Minimum Speed would otherwise be violated." msgstr "" -"Minimalny czas spędzony w warstwie. Zmusza to drukarkę do spowolnienia, aby " -"przynajmniej spędzić czas ustawiony tutaj w jednej warstwie. Pozwala to na " -"właściwy wydruk przed wydrukowaniem następnej warstwy. Warstwy mogą nadal " -"trwać krócej niż minimalny czas warstwy, jeśli Lift Head jest wyłączony, a " -"jeśli Minimalna prędkość zostanie w inny sposób naruszona." +"Minimalny czas spędzony na warstwie. Zmusza to drukarkę do spowolnienia, aby " +"spędzić przynajmniej ten czas na jednej warstwie. Pozwala to na właściwe " +"schłodzenie materiału przed wydrukowaniem następnej warstwy. Warstwy mogą " +"nadal trwać krócej niż minimalny czas warstwy, jeśli Unieś Głowicę jest " +"wyłączone, a jeśli Minimalna Prędkość zostanie w jakiś sposób zmieniona." msgctxt "cool_min_layer_time label" msgid "Minimum Layer Time" -msgstr "Minimalny czas na warstwie" +msgstr "Minimalny Czas Warstwy" msgctxt "cool_min_layer_time_fan_speed_max description" msgid "" @@ -604,7 +596,7 @@ msgstr "" msgctxt "cool_min_layer_time_fan_speed_max label" msgid "Regular/Maximum Fan Speed Threshold" -msgstr "Regularny / maksymalny próg prędkości wentylatora" +msgstr "Regularny/Maks. Próg Pręd. Wentylatora" msgctxt "cool_min_speed description" msgid "" @@ -613,12 +605,12 @@ msgid "" "be too low and result in bad print quality." msgstr "" "Minimalna szybkość drukowania, pomimo spowolnienia z powodu minimalnego " -"czasu warstwy. Gdy drukarka spowolniła zbyt dużo, ciśnienie w dyszy byłoby " -"zbyt niskie i spowodowało złe jakości druku." +"czasu warstwy. Gdy drukarka spowolnia zbyt dużo, ciśnienie w dyszy jest zbyt " +"niskie co pogarsza jakość wydruków." msgctxt "cool_min_speed label" msgid "Minimum Speed" -msgstr "Minimalna prędkość" +msgstr "Minimalna Prędkość" msgctxt "cooling description" msgid "Cooling" @@ -634,13 +626,13 @@ msgid "" "make certain areas of one mesh print with different settings and with a " "whole different extruder." msgstr "" -"Ograniczyć objętość tej siatki do innych oczek. Można to zrobić, aby " -"niektóre obszary jednego oczka były drukowane z różnymi ustawieniami iz " -"całością innej wytłaczarki." +"Potnij siatkę na części. Możesz to zrobić, aby stworzyć określone miejsca w " +"jednej siatce, które będą drukowane z innymi ustawieniami, a nawet innym " +"ekstruderem." msgctxt "cutting_mesh label" msgid "Cutting Mesh" -msgstr "Obróbka siatki" +msgstr "Cięcie Siatki" msgctxt "default_material_print_temperature description" msgid "" @@ -648,34 +640,34 @@ msgid "" "temperature of a material. All other print temperatures should use offsets " "based on this value" msgstr "" -"Domyślna temperatura używana do drukowania. Powinno to być temperatura " -"\"podstawy\" materiału. Wszystkie inne temperatury drukowania powinny być " -"wykorzystywane z przesunięciami w oparciu o tę wartość" +"Domyślna temperatura używana do drukowania. Powinno to być \"podstawowa\" " +"temperatura materiału. Wszystkie inne temperatury powinny wykorzystywać " +"przesunięcie względem tej wartości" msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" -msgstr "Domyślna temperatura druku" +msgstr "Domyślna Temperatura Druku" msgctxt "draft_shield_dist description" msgid "Distance of the draft shield from the print, in the X/Y directions." -msgstr "Odległość projektowanej osłony od druku, w kierunkach X / Y." +msgstr "Odległość osłony przeciwwiatrowej od druku, we współrzędnych X/Y." msgctxt "draft_shield_dist label" msgid "Draft Shield X/Y Distance" -msgstr "Otwór tarczy X / Y Odległość" +msgstr "Odległość Osłony w X/Y" msgctxt "draft_shield_enabled description" msgid "" "This will create a wall around the model, which traps (hot) air and shields " "against exterior airflow. Especially useful for materials which warp easily." msgstr "" -"Powoduje to powstanie ściany wokół modelu, która pułapuje (gorące powietrze) " -"i osłona przed zewnętrznym strumieniem powietrza. Szczególnie przydatna w " -"przypadku materiałów, które łatwo oswajają się." +"Powoduje to powstanie osłony wokół modelu, która wyłapuje (gorące) powietrze " +"i osłania przed ruchami powietrza. Szczególnie przydatna w przypadku " +"materiałów, które łatwo się rozwarstwiają." msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" -msgstr "Aktywować przedniej szyby (Draft Shield)" +msgstr "Włącz Osłonę Przeciwwiatrową" msgctxt "draft_shield_height description" msgid "" @@ -683,39 +675,39 @@ msgid "" "will be printed." msgstr "" "Ograniczenie wysokości osłony przeciwwiatrowej. Powyżej tej wysokości nie " -"zostanie wydrukowana talia robocza." +"będzie drukowana żadna osłona." msgctxt "draft_shield_height label" msgid "Draft Shield Height" -msgstr "Wysokość osłony tarczy" +msgstr "Wysokość Osłony" msgctxt "draft_shield_height_limitation description" msgid "" "Set the height of the draft shield. Choose to print the draft shield at the " "full height of the model or at a limited height." msgstr "" -"Ustaw wysokość osłony przeciwwiatrowej. Wybierz drukowaną osłonę na całej " -"wysokości modelu lub na ograniczonej wysokości." +"Ustaw wysokość osłony przeciwwiatrowej. Wybierz czy drukować osłonę do " +"pełnej wysokości modelu czy do określonej wysokości." msgctxt "draft_shield_height_limitation label" msgid "Draft Shield Limitation" -msgstr "Ograniczenie tarczy konstrukcyjnej" +msgstr "Ograniczenie Osłony" msgctxt "draft_shield_height_limitation option full" msgid "Full" -msgstr "Pełny" +msgstr "Pełna" msgctxt "draft_shield_height_limitation option limited" msgid "Limited" -msgstr "Ograniczony" +msgstr "Ograniczona" msgctxt "dual description" msgid "Settings used for printing with multiple extruders." -msgstr "Ustawienia używane do drukowania z wieloma głowicami drukującymi" +msgstr "Ustawienia używane do drukowania wieloma głowicami." msgctxt "dual label" msgid "Dual Extrusion" -msgstr "Podwójna głowica drukująca" +msgstr "Podwójna ekstruzja" msgctxt "dual_pre_wipe description" msgid "" @@ -723,26 +715,25 @@ msgid "" "first thing printed. This performs a safe slow wipe move at a place where " "the oozed material causes least harm to the surface quality of your print." msgstr "" -"Po wyłączeniu wytłaczarki wytrzeć wytłoczony materiał z dyszy na pierwszą " -"drukowaną drukarkę. Zapewnia to bezpieczne, wolne przemieszczanie w miejscu, " -"w którym wypchnięty materiał powoduje najmniej szkodliwy wpływ na jakość " -"wydruku." +"Po przełączeniu ekstrudera, wytrzyj materiał wyciekający z dyszy na pierwszą " +"drukowaną część. powoduje to bezpieczny, powolny ruch wycierania w miejscu " +"gdzie wyciekający materiał nie spowoduje dużej szkody dla powierzchni modelu." msgctxt "dual_pre_wipe label" msgid "Wipe Nozzle After Switch" -msgstr "Wytrzeć dyszę po przełączeniu" +msgstr "Wytrzyj Dyszę po Przełączeniu" msgctxt "expand_lower_skins description" msgid "" "Expand the bottom skin areas (areas with air below) so that they are " "anchored by the infill layers above and below." msgstr "" -"Rozwiń dolne obszary ścian (obszary o powietrzu poniżej) tak, aby były " -"zakotwiczone przez warstwy wypełniające powyżej i poniżej." +"Rozszerz dolną powłokę (obszary, pod którym jest powietrze) tak, aby zostały " +"zakotwiczone o warstwy wypełniające powyżej i poniżej." msgctxt "expand_lower_skins label" msgid "Expand Bottom Skins Into Infill" -msgstr "Rozszerzyć ściany poniżej wypełnienia" +msgstr "Rozszerz Dolną Powłokę Do Wypełn." msgctxt "expand_skins_expand_distance description" msgid "" @@ -751,14 +742,14 @@ msgid "" "appearing in the skin where it meets the wall when the infill density is " "low. A smaller distance will often be sufficient." msgstr "" -"Odległość ścian są rozszerzane do wypełnienia. Domyślna odległość wystarczy, " -"aby pokonać szczelinę między liniami wypełnienia i zatrzyma otwory " -"pojawiające się w ścianie, gdzie spotyka się ze ścianą, gdy gęstość " -"nasycenia jest niska. Mniejsza odległość będzie często wystarczająca." +"Odległość na jaką powłoki zostają rozszerzone do wypełnienia. Domyślna " +"odległość wystarcza, aby pokonać szczelinę między liniami wypełnienia i nie " +"dopuścić do powstania dziur, gdzie spotyka się z powłoką, gdy gęstość " +"wypełnienia jest niska. Mniejsza odległość będzie często wystarczająca." msgctxt "expand_skins_expand_distance label" msgid "Skin Expand Distance" -msgstr "Odległość rozszerzenie warstwy wierzchniej" +msgstr "Odległość Rozsz. Powłoki" msgctxt "expand_skins_into_infill description" msgid "" @@ -768,92 +759,85 @@ msgid "" "skins beyond the wall lines so that the infill on the next layer rests on " "skin." msgstr "" -"Rozszerzyć zewnętrzne obszary skóry na górną i / lub dolną powłoką na " -"płaskich powierzchniach. Domyślnie, powłoka kończy się na linii ściany " -"otaczające wypełnienie, chociaż może to prowadzić do małej gęstości otworu " -"napełniania do edukacji. Ustawienie to rozciąga się poza zewnętrzną skórę po " -"liniach ścian, tak, że nadzienie pozostaje na następnej warstwy na " -"zewnętrznej skóry." +"Rozszerz obszary powłoki na górze i/lub dole powierzchni płaskich. " +"Domyślnie, powłoka kończy się na linii ściany otaczające wypełnienie, " +"chociaż może to prowadzić do powstawania dziur kiedy gęstość wypełnienia " +"jest niska. Ustawienie to rozciąga powłokę poza linię ściany, dzięki czemu " +"wypełnienie na kolejnej warstwie osiada na powłoce." msgctxt "expand_skins_into_infill label" msgid "Expand Skins Into Infill" -msgstr "Rozszerzyć ściany wypełniania" +msgstr "Rozszerz Powłokę Do Wypełn." msgctxt "expand_upper_skins description" msgid "" "Expand the top skin areas (areas with air above) so that they support infill " "above." msgstr "" -"Rozwiń górne obszary ścian (obszary o powietrzu powyżej) tak, aby wspomagały " -"wypełnienie powyżej." +"Rozszerz górne obszary ścian (obszary, które mają ponad sobą powietrze) tak, " +"aby wspomagały wypełnienie powyżej." msgctxt "expand_upper_skins label" msgid "Expand Top Skins Into Infill" -msgstr "Rozszerzenia ścian w górnym wypełnieniu" +msgstr "Rozszerz Górną Powłokę Do Wypełn." msgctxt "experimental description" msgid "experimental!" -msgstr "eksperymentalny!" +msgstr "eksperymentalne!" msgctxt "experimental label" msgid "Experimental" -msgstr "Eksperymentalny" +msgstr "Eksperymentalne" msgctxt "extruder_prime_pos_abs description" msgid "" "Make the extruder prime position absolute rather than relative to the last-" "known location of the head." msgstr "" -"Wolisz bezwzględną pozycję głowicy drukującej zamiast względnego położenia " -"do ostatniej znanej pozycji głowy." +"Zmień pozycję końcową ekstrudera na bezwzględną, zamiast względem ostatniej " +"pozycji głowicy." msgctxt "extruder_prime_pos_abs label" msgid "Absolute Extruder Prime Position" -msgstr "Wytłaczarka pozycja bezwzględna obciążenie" +msgstr "Bezwzgl. Końcowa Pozycja Ekstrudera" msgctxt "extruder_prime_pos_x description" msgid "" "The X coordinate of the position where the nozzle primes at the start of " "printing." -msgstr "" -"Współrzędna X położenia, w którym liczba pierwszych dyszy na początku " -"drukowania." +msgstr "Współrzędna X, w której dysza jest czyszczona na początku wydruku." msgctxt "extruder_prime_pos_x label" msgid "Extruder Prime X Position" -msgstr "X wlotu położenie wytłaczarki" +msgstr "Pozycja X Czyszczenia Dyszy" msgctxt "extruder_prime_pos_y description" msgid "" "The Y coordinate of the position where the nozzle primes at the start of " "printing." -msgstr "" -"Współrzędna Y położenia, w którym liczba pierwszych dyszy na początku " -"drukowania." +msgstr "Współrzędna Y, w której dysza jest czyszczona na początku wydruku." msgctxt "extruder_prime_pos_y label" msgid "Extruder Prime Y Position" -msgstr "Y-wlotu położenie wytłaczarki" +msgstr "Pozycja Y Czyszczenia Dyszy" msgctxt "extruder_prime_pos_z description" msgid "" "The Z coordinate of the position where the nozzle primes at the start of " "printing." -msgstr "" -"Współrzędna położenia, w którym dysza liczb pierwszych w rozpoczęcia " -"drukowania." +msgstr "Współrzędna Z, w której dysza jest czyszczona na początku wydruku." msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "Z-położenia wlotu wytłaczarki" +msgstr "Pozycja Z Czyszczenia Dyszy" msgctxt "fill_perimeter_gaps description" msgid "Fills the gaps between walls where no walls fit." -msgstr "Wypełnia szczeliny między ścianami, w których nie ma ścian." +msgstr "Wypełnia szczeliny pomiędzy ściany gdzie żadna ściana nie pasuje." msgctxt "fill_perimeter_gaps label" msgid "Fill Gaps Between Walls" -msgstr "Wypełnij szczeliny między ścianami" +msgstr "Wypełnij Szczeliny Między Ścianami" msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" @@ -868,11 +852,11 @@ msgid "" "The height difference between the tip of the nozzle and the gantry system (X " "and Y axes)." msgstr "" -"Różnica wysokości między wierzchołkiem dyszy i układu bramowej (X i Y)." +"Różnica wysokości między wierzchołkiem dyszy a suwnicą (gantry) (osie X i Y)." msgctxt "gantry_height label" msgid "Gantry height" -msgstr "wysokość mostka" +msgstr "Wysokość Suwnicy (Gantry)" msgctxt "gradual_infill_step_height description" msgid "" @@ -882,7 +866,7 @@ msgstr "" msgctxt "gradual_infill_step_height label" msgid "Gradual Infill Step Height" -msgstr "Stopień stopniowego wypełnienia" +msgstr "Wys. Stopnia Stopniowego Wypełn." msgctxt "gradual_infill_steps description" msgid "" @@ -890,13 +874,13 @@ msgid "" "below top surfaces. Areas which are closer to top surfaces get a higher " "density, up to the Infill Density." msgstr "" -"Liczba razy, aby zmniejszyć gęstość zalewu o połowę, gdy będzie się dalej " -"pod górnymi powierzchniami. Obszary, które są bliżej górnej powierzchni, " -"mają większą gęstość, aż do gęstości wypełnienia." +"Liczba redukcji wypełnienia o połowę podczas drukowania poniżej górnych " +"powierzchni. Obszary, które są bliżej górnej powierzchni, mają większą " +"gęstość, aż do Gęstości Wypełnienia." msgctxt "gradual_infill_steps label" msgid "Gradual Infill Steps" -msgstr "Stopniowe kroki wypełnienia" +msgstr "Stopnie Stopniowego Wypełn." msgctxt "infill description" msgid "Infill" @@ -915,16 +899,16 @@ msgid "" "which means use the traditional default angles (45 and 135 degrees for the " "lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "" -"Lista prostych poleceń do użycia. Elementy z listy są używane kolejno w " -"miarę postępu warstw, a kiedy kończy się lista, zaczyna się od początku. " -"Elementy listy są oddzielone przecinkami, a cała lista znajduje się w " -"nawiasach kwadratowych. Domyślnie jest pusta lista, która oznacza tradycyjne " -"domyślne kąty (45 i 135 stopni dla linii i wzorów zygzakowców i 45 stopni " -"dla wszystkich pozostałych wzorów)." +"Lista całkowitych kierunków linii do użycia. Elementy z listy są używane " +"kolejno w miarę postępu warstw, a kiedy kończy się lista, zaczyna się od " +"początku. Elementy listy są oddzielone przecinkami, a cała lista znajduje " +"się w nawiasach kwadratowych. Domyślnie lista jest pusta, co oznacza " +"tradycyjne domyślne kąty (45 i 135 stopni dla linii i wzorów zygzakowych i " +"45 stopni dla wszystkich pozostałych wzorów)." msgctxt "infill_angles label" msgid "Infill Line Directions" -msgstr "Kierunek lini wypełnienia" +msgstr "Kierunek Linii Wypełn." msgctxt "infill_before_walls description" msgid "" @@ -933,25 +917,25 @@ msgid "" "first leads to sturdier walls, but the infill pattern might sometimes show " "through the surface." msgstr "" -"Wydrukuj wypełnienie przed wydrukowaniem ścian. Drukowanie ścian po raz " -"pierwszy może prowadzić do bardziej dokładnych ścian, ale pogorszy wydruki. " +"Wydrukuj wypełnienie przed wydrukowaniem ścian. Drukowanie ścian jako " +"pierwsze może prowadzić do bardziej dokładnych ścian, ale pogorszy zwisy. " "Drukowanie wypełnienia najpierw prowadzi do mocniejszych ścian, ale wzór " -"wypełnienia może czasem wskazywać na powierzchnię." +"wypełnienia może czasem być widoczny przez powierzchnię." msgctxt "infill_before_walls label" msgid "Infill Before Walls" -msgstr "Wypełnij przed ścianami" +msgstr "Wypełn. przed Ścianami" msgctxt "infill_hollow description" msgid "" "Remove all infill and make the inside of the object eligible for support." msgstr "" -"Usunąć wszystkie wypełnienia i umieścić wewnątrz obiektu kwalifikującego się " -"do wsparcia." +"Usuń całe wypełnienie i spowoduj, aby środek modelu był wybieralny dla " +"podpór." msgctxt "infill_hollow label" msgid "Hollow Out Objects" -msgstr "Wyjmij obiekty" +msgstr "Wydrąż Model" msgctxt "infill_line_distance description" msgid "" @@ -959,11 +943,11 @@ msgid "" "infill density and the infill line width." msgstr "" "Odległość między drukowanymi liniami wypełnienia. To ustawienie jest " -"obliczane przez gęstość wypełnienia i szerokość linii wypełnienia." +"obliczane za pomocą gęstości wypełnienia i szerokość linii wypełnienia." msgctxt "infill_line_distance label" msgid "Infill Line Distance" -msgstr "Odstęp linii wypełnienia" +msgstr "Odstęp Linii Wypełn." msgctxt "infill_line_width description" msgid "Width of a single infill line." @@ -971,7 +955,7 @@ msgstr "Szerokość pojedynczej linii wypełniania." msgctxt "infill_line_width label" msgid "Infill Line Width" -msgstr "Szerokość linii wypełniania" +msgstr "Szerokość Linii Wypełn." msgctxt "infill_mesh description" msgid "" @@ -979,14 +963,14 @@ msgid "" "Replaces infill regions of other meshes with regions for this mesh. It's " "suggested to only print one Wall and no Top/Bottom Skin for this mesh." msgstr "" -"Użyj tej siatki, aby zmodyfikować wypełnienie innych oczek, z którymi się " -"pokrywają. Zastępuje obszary wypełnienia innych oczek z regionami dla tej " -"siatki. Proponuje się wydrukować tylko jedną ścianę, a nie górną / dolną " -"skórę dla tej siatki." +"Użyj tej siatki, aby zmodyfikować wypełnienie innych siatek, z którymi się " +"pokrywa. Zastępuje obszary wypełnienia innych siatek obszarami dla tej " +"siatki. Proponuje się wydrukować tylko jedną ścianę bez górnej/dolnej " +"powłoki dla tej siatki." msgctxt "infill_mesh label" msgid "Infill Mesh" -msgstr "Siatki wypełniające" +msgstr "Siatka Wypełn." msgctxt "infill_mesh_order description" msgid "" @@ -994,37 +978,37 @@ msgid "" "infill mesh with a higher order will modify the infill of infill meshes with " "lower order and normal meshes." msgstr "" -"Określa, która siatka wypełniająca znajduje się wewnątrz wypełnienia innej " -"siatki wypełniającej. Siatka wypełniająca o wyższym porządku modyfikuje " -"wypełnienie siatki wypełnień o niższym rzędzie i normalnych oczek." +"Określa, która siatka wypełnienia znajduje się wewnątrz wypełnienia innej " +"siatki wypełnienia. Siatka wypełniająca o wyższym porządku modyfikuje " +"wypełnienie siatki wypełnień o niższym porządku i normalnych siatek." msgctxt "infill_mesh_order label" msgid "Infill Mesh Order" -msgstr "Zamówienie wypełnienia siatki" +msgstr "Porządek Siatki Wypełn." msgctxt "infill_overlap description" msgid "" "The amount of overlap between the infill and the walls. A slight overlap " "allows the walls to connect firmly to the infill." msgstr "" -"Ilość nakładania się między wypełnieniem a ścianami. Nieznaczne nałożenie " +"Ilość nałożenia pomiędzy wypełnieniem a ścianami. Nieznaczne nałożenie " "pozwala ściśle łączyć się z wypełnieniem." msgctxt "infill_overlap label" msgid "Infill Overlap Percentage" -msgstr "Procent wypełnienia" +msgstr "Procent Nałożenia Wypełn." msgctxt "infill_overlap_mm description" msgid "" "The amount of overlap between the infill and the walls. A slight overlap " "allows the walls to connect firmly to the infill." msgstr "" -"Ilość nakładania się między wypełnieniem a ścianami. Nieznaczne nałożenie " +"Ilość nałożenia pomiędzy wypełnieniem a ścianami. Nieznaczne nałożenie " "pozwala ściśle łączyć się z wypełnieniem." msgctxt "infill_overlap_mm label" msgid "Infill Overlap" -msgstr "Zachodzenie wypełnienia" +msgstr "Nałożenie Wypełn." msgctxt "infill_pattern description" msgid "" @@ -1034,16 +1018,15 @@ msgid "" "layer. Cubic and tetrahedral infill change with every layer to provide a " "more equal distribution of strength over each direction." msgstr "" -"Wzór materiału wypełniającego z nadruku. Linia i zygzakowy kierunek " -"wypełnienial na alternatywnych warstwach, zmniejszając koszt materiału. " -"Wzory siatki, trójkąty, sześcianu, czworościanu i koncentrycznych są w pełni " -"drukowane na każdej warstwie. Wymiana wypełnienia sześciennego i " -"czterowartościowego z każdą warstwą zapewnia bardziej równomierny rozkład " -"siły w każdym kierunku." +"Wzór materiału wypełniającego. Linia i zygzakowy wypełnienie zmienia " +"kierunek na przemiennych warstwach zmniejszając koszt materiału. Wzory " +"siatki, trójkątne, sześcienne, czworościenne i koncentryczne są w pełni " +"drukowane na każdej warstwie. Wypełnienie sześcienne i czworościenne zmienia " +"się co każdą warstwę, aby zapewnić równe rozłożenie siły w każdym kierunku." msgctxt "infill_pattern label" msgid "Infill Pattern" -msgstr "Wzór wypełnienia" +msgstr "Wzór Wypełn." msgctxt "infill_pattern option concentric" msgid "Concentric" @@ -1063,11 +1046,11 @@ msgstr "Podział sześcienny" msgctxt "infill_pattern option grid" msgid "Grid" -msgstr "Krata" +msgstr "Kratka" msgctxt "infill_pattern option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "infill_pattern option tetrahedral" msgid "Tetrahedral" @@ -1083,23 +1066,23 @@ msgstr "Zygzak" msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "Dostosowuje gęstość wypełnienia wydruku." +msgstr "Dostosowuje gęstość wypełnienia wydruku" msgctxt "infill_sparse_density label" msgid "Infill Density" -msgstr "Gęstość wypełnienia" +msgstr "Gęstość Wypełn." msgctxt "infill_sparse_thickness description" msgid "" "The thickness per layer of infill material. This value should always be a " "multiple of the layer height and is otherwise rounded." msgstr "" -"Grubość na warstwie materiału wypełniającego. Ta wartość powinna zawsze być " -"wielokrotnością wysokości warstwy i być zaokrąglana w inny sposób." +"Grubość na warstwe materiału wypełniającego. Ta wartość powinna zawsze być " +"wielokrotnością wysokości warstwy i być zaokrąglana." msgctxt "infill_sparse_thickness label" msgid "Infill Layer Thickness" -msgstr "Grubość warstwy wypełnienia" +msgstr "Grubość Warstwy Wypełn." msgctxt "infill_wipe_dist description" msgid "" @@ -1107,14 +1090,13 @@ msgid "" "infill stick to the walls better. This option is similar to infill overlap, " "but without extrusion and only on one end of the infill line." msgstr "" -"Odległość przesuwu włożonego po każdej linii wylotowej, aby lepiej " -"przymocować drążek wyrównawczy do ścian. Ta opcja jest podobna do nakładania " -"się wypełnienia, ale bez wytłaczania i tylko na jednym końcu linii " -"wypełnienia." +"Odległość ruchu jałowego pomiędzy każdą linią wypełnienia, aby lepiej " +"przymocować linię wypełnienia do ścian. Ta opcja jest podobna do nakładania " +"się wypełnienia, ale bez ekstruzji i tylko na jednym końcu linii wypełnienia." msgctxt "infill_wipe_dist label" msgid "Infill Wipe Distance" -msgstr "Odstęp wypełnienia" +msgstr "Dług. Czyszczenia Wypełn." msgctxt "jerk_enabled description" msgid "" @@ -1122,22 +1104,21 @@ msgid "" "axis changes. Increasing the jerk can reduce printing time at the cost of " "print quality." msgstr "" -"Umożliwia dostosowanie funkcji szarpnięć głowicy drukującej w przypadku " -"zmiany prędkości w osi X lub Y. Zwiększenie funkcji szarpnięć może skrócić " -"czas drukowania kosztem jakości druku." +"Umożliwia dostosowanie zwrywu głowicy w przypadku zmiany prędkości w osi X " +"lub Y. Zwiększenie zrywu może skrócić czas drukowania kosztem jakości druku." msgctxt "jerk_enabled label" msgid "Enable Jerk Control" -msgstr "Aktywuj kontrolę szarpnięć" +msgstr "Włącz Kontrole Zrywu" msgctxt "jerk_infill description" msgid "The maximum instantaneous velocity change with which infill is printed." msgstr "" -"Maksymalna różnica prędkości chwilowej w którym wypełnienie jest drukowane." +"Maksymalna zmiana prędkości chwilowej, z którą jest drukowane wypełnienie." msgctxt "jerk_infill label" msgid "Infill Jerk" -msgstr "Wypełnienie Funkcja szarpnięcie (jerk)" +msgstr "Zryw Wypełnienie" msgctxt "jerk_layer_0 description" msgid "The print maximum instantaneous velocity change for the initial layer." @@ -1145,168 +1126,165 @@ msgstr "Maksymalna zmiana chwilowej prędkości dla pierwszej warstwy." msgctxt "jerk_layer_0 label" msgid "Initial Layer Jerk" -msgstr "Funkcja szarpnięcie (jerk) pierwszej warstwie" +msgstr "Zryw Pierwsz. Warstwa" msgctxt "jerk_prime_tower description" msgid "" "The maximum instantaneous velocity change with which the prime tower is " "printed." -msgstr "Maksymalne chwilowe zmiany prędkości posuwu z wieżą jest drukowany." +msgstr "" +"Maksymalna zmiana chwilowej prędkości z jaką drukowana jest wieża czyszcząca." msgctxt "jerk_prime_tower label" msgid "Prime Tower Jerk" -msgstr "Jerk zmiany prędkości posuwu z wieżą" +msgstr "Zryw Wieży Czyszczącej" msgctxt "jerk_print description" msgid "The maximum instantaneous velocity change of the print head." -msgstr "Maksymalna chwilowa zmiana prędkości głowicy drukującej." +msgstr "Maksymalna zmiana prędkości chwilowej głowicy drukującej." msgctxt "jerk_print label" msgid "Print Jerk" -msgstr "Jerk funkcja druku" +msgstr "Zryw Druku" msgctxt "jerk_print_layer_0 description" msgid "" "The maximum instantaneous velocity change during the printing of the initial " "layer." msgstr "" -"Maksymalna zmiana chwilowej prędkości podczas druku na pierwszej warstwie" +"Maksymalna zmiana prędkości chwilowej podczas drukowania pierwszej warstwy." msgctxt "jerk_print_layer_0 label" msgid "Initial Layer Print Jerk" -msgstr "Jerk warstwy początkowej druku" +msgstr "Zryw Początk. Warstwy" msgctxt "jerk_skirt_brim description" msgid "" "The maximum instantaneous velocity change with which the skirt and brim are " "printed." msgstr "" -"Maksymalna zmiana chwilowej prędkości mogą być drukowane z płaszcza i brzegi." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są obwódka i obrys." msgctxt "jerk_skirt_brim label" msgid "Skirt/Brim Jerk" -msgstr "Jerk Skirt/Brim" +msgstr "Zryw Obwódki/Obrysu" msgctxt "jerk_support description" msgid "" "The maximum instantaneous velocity change with which the support structure " "is printed." -msgstr "" -"Maksymalna natychmiastowa zmiana prędkości, przy której konstrukcja nośna " -"jest drukowana." +msgstr "Maksymalna zmiana prędkości chwilowej z jaką drukowane są podpory." msgctxt "jerk_support label" msgid "Support Jerk" -msgstr "Jerk konstrukcja nośna " +msgstr "Zryw Podpory" msgctxt "jerk_support_bottom description" msgid "" "The maximum instantaneous velocity change with which the floors of support " "are printed." -msgstr "Maksymalna szybkość zmiany chwilowej, z jaką są drukowane podłoża." +msgstr "" +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są podłoża podpór." msgctxt "jerk_support_bottom label" msgid "Support Floor Jerk" -msgstr "Funkcja szarpnięcie (jerk) struktury podłoża" +msgstr "Zryw Podł. Podpór" msgctxt "jerk_support_infill description" msgid "" "The maximum instantaneous velocity change with which the infill of support " "is printed." msgstr "" -"Maksymalna różnica prędkości chwilowej z których wypełnienie konstrukcji " -"nośnej jest drukowane." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane jest wypełnienie " +"podpory." msgctxt "jerk_support_infill label" msgid "Support Infill Jerk" -msgstr "Funkcja szarpnięcie (jerk) konstrukcja nośna wypełniania" +msgstr "Zryw Wypełnienia Podpory" msgctxt "jerk_support_interface description" msgid "" "The maximum instantaneous velocity change with which the roofs and floors of " "support are printed." msgstr "" -"Maksymalna natychmiastowa zmiana prędkości, przy której dachy i stropy " -"konstrukcji nośnej mają zostać wydrukowane." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są podłoża i dachy " +"podpory." msgctxt "jerk_support_interface label" msgid "Support Interface Jerk" -msgstr "Funkcja szarpnięcie (jerk) interfejs konstrukcja nośna" +msgstr "Zryw Połączenia Podpory" msgctxt "jerk_support_roof description" msgid "" "The maximum instantaneous velocity change with which the roofs of support " "are printed." msgstr "" -"Maksymalna zmiana chwilowej prędkości z dachów konstrukcji nośnej do " -"wydrukowania." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są dachy podpory." msgctxt "jerk_support_roof label" msgid "Support Roof Jerk" -msgstr "Funkcja szarpnięcie (jerk) do konstrukcji dachu" +msgstr "Zryw Dachu Podpory" msgctxt "jerk_topbottom description" msgid "" "The maximum instantaneous velocity change with which top/bottom layers are " "printed." msgstr "" -"Maksymalna różnica prędkości chwilowej w którym górne / dolne warstwy druku." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są górne/dolne " +"warstwy." msgctxt "jerk_topbottom label" msgid "Top/Bottom Jerk" -msgstr "Funkcja szarpnięcie (jerk) górnej / dolnej warstwy" +msgstr "Zryw Góra/Dół" msgctxt "jerk_travel description" msgid "" "The maximum instantaneous velocity change with which travel moves are made." msgstr "" -"Maksymalna natychmiastowa zmiana prędkości, przy której odbywa się ruch " -"podróży." +"Maksymalna zmiana prędkości chwilowej z jaką wykonywane są ruchy jałowe." msgctxt "jerk_travel label" msgid "Travel Jerk" -msgstr "Podróże Jerk" +msgstr "Zryw Ruch Jałowy" msgctxt "jerk_travel_layer_0 description" msgid "The acceleration for travel moves in the initial layer." -msgstr "Przyspieszenie ruchu napędu pierwszej warstwy." +msgstr "Przyspieszenie dla ruchów jałowych na początkowej warstwie." msgctxt "jerk_travel_layer_0 label" msgid "Initial Layer Travel Jerk" -msgstr "Funkcja szarpnięcie przepływu w pierwszej warstwie" +msgstr "Zryw Początk. Wartswa" msgctxt "jerk_wall description" msgid "" "The maximum instantaneous velocity change with which the walls are printed." -msgstr "Maksymalna różnica prędkości chwilowej z którego ściany są drukowane." +msgstr "Maksymalna zmiana prędkości chwilowej z jaką drukowane są ściany." msgctxt "jerk_wall label" msgid "Wall Jerk" -msgstr "Funkcja szarpnięcie (jerk) ścianki" +msgstr "Zryw Ściany" msgctxt "jerk_wall_0 description" msgid "" "The maximum instantaneous velocity change with which the outermost walls are " "printed." msgstr "" -"Maksymalna zmiana chwilowej prędkości z zewnętrznymi ścianami do " -"wydrukowania." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są zewnętrzne ściany." msgctxt "jerk_wall_0 label" msgid "Outer Wall Jerk" -msgstr "Funkcja szarpnięcie (jerk) zewnątrz ścianki" +msgstr "Zryw Zewn. Ścian" msgctxt "jerk_wall_x description" msgid "" "The maximum instantaneous velocity change with which all inner walls are " "printed." msgstr "" -"Maksymalna zmiana chwilowej prędkości, wszystkie wewnętrzne ściany są " -"drukowane." +"Maksymalna zmiana prędkości chwilowej z jaką drukowane są wewnętrzne ściany." msgctxt "jerk_wall_x label" msgid "Inner Wall Jerk" -msgstr "Funkcja szarpnięcie (jerk) wewnętrznej ściance" +msgstr "Zryw Wewn. Ścian" msgctxt "layer_0_z_overlap description" msgid "" @@ -1314,62 +1292,62 @@ msgid "" "compensate for the filament lost in the airgap. All models above the first " "model layer will be shifted down by this amount." msgstr "" -"Pierwsza i druga warstwa modelu są zachodzą na siebie w kierunku Z w celu " -"skompensowania utraconego włókna w szczelinie powietrznej. Przenieś " -"wszystkie modele od pierwszej warstwy modelu o tej wartości w dół." +"Niech pierwsza i druga warstwa nachodzą na siebie w osi Z, aby skompensować " +"stratę filamentu w szczelinie powietrznej. Wszystkie modele powyżej " +"pierwszej warstwy modelu będą obniżone o tą wartość." msgctxt "layer_0_z_overlap label" msgid "Initial Layer Z Overlap" -msgstr "Początkowa warstwa Z pokrywają się" +msgstr "Pokryw. się Pierwsz. Warstwy w Z" msgctxt "layer_height description" msgid "" "The height of each layer in mm. Higher values produce faster prints in lower " "resolution, lower values produce slower prints in higher resolution." msgstr "" -"Grubość każdej warstwy w mm. Przy wyższych wartościach szybsze Urządzenie " -"jest przystosowane do niższej rozdzielczości w niższych wartościach wolniej " -"wydruki o wyższej rozdzielczości." +"Grubość każdej warstwy w mm. Wyższe wartości powodują szybszy wydruk w " +"niskiej rozdzielczości, niższe wartości powodują wolniejszy wydruk w wyższej " +"rozdzielczości." msgctxt "layer_height label" msgid "Layer Height" -msgstr "Grubość warstwy" +msgstr "Wysokość Warstwy" msgctxt "layer_height_0 description" msgid "" "The height of the initial layer in mm. A thicker initial layer makes " "adhesion to the build plate easier." msgstr "" -"Wysokość początkowej warstwy w mm. Grubsza warstwa powoduje lepszą " -"początkową przyczepność do stołu." +"Wysokość początkowej warstwy w mm. Grubsza początkowa warstwa powoduje " +"lepszą przyczepność do stołu." msgctxt "layer_height_0 label" msgid "Initial Layer Height" -msgstr "Grubość pierwszej warstwy" +msgstr "Wys. Początkowej Warstwy" msgctxt "layer_start_x description" msgid "" "The X coordinate of the position near where to find the part to start " "printing each layer." msgstr "" -"Współrzędna X położenia, w pobliżu miejsca, gdzie znajduje się część, aby " -"rozpocząć drukowanie każdej warstwy." +"Współrzędna X pozycji blisko miejsca gdzie ma rozpoczynać się drukowanie " +"każdej warstwy." msgctxt "layer_start_x label" msgid "Layer Start X" -msgstr "Uruchomienie warstwy X" +msgstr "Początek Warstwy X" msgctxt "layer_start_y description" msgid "" "The Y coordinate of the position near where to find the part to start " "printing each layer." msgstr "" -"Współrzędna Y położenia, w pobliżu miejsca, gdzie znajduje się część, aby " -"rozpocząć drukowanie każdej warstwy." +"Współrzędna Y pozycji blisko miejsca gdzie ma rozpoczynać się drukowanie " +"każdej warstwy." msgctxt "layer_start_y label" msgid "Layer Start Y" -msgstr "Uruchom warstwę Y" +msgstr "Początek Warstwy Y" msgctxt "line_width description" msgid "" @@ -1377,33 +1355,31 @@ msgid "" "to the width of the nozzle. However, slightly reducing this value could " "produce better prints." msgstr "" -"Szerokość jednej linii. Ogólnie, szerokość powinna odpowiadać każdej linii " -"szerokości dyszy. Jednak nieznaczne zmniejszenie tej wartości może " -"doprowadzić do lepszego drukowania." +"Szerokość jednej linii. Ogólnie, szerokość powinna być taka sama jak " +"średnica dyszy. Jednak nieznaczne zmniejszenie tej wartości może prowadzić " +"do lepszych wydruków." msgctxt "line_width label" msgid "Line Width" -msgstr "Szerokość linii" +msgstr "Szerokość Linii" msgctxt "machine_acceleration description" msgid "The default acceleration of print head movement." -msgstr "Domyślną przyspieszenie ruchu głowicy drukującej." +msgstr "Domyślną przyspieszenie ruchu głowicy." msgctxt "machine_acceleration label" msgid "Default Acceleration" -msgstr "Domyślne przyspieszenie" +msgstr "Domyślne Przyspieszenie" msgctxt "machine_center_is_zero description" msgid "" "Whether the X/Y coordinates of the zero position of the printer is at the " "center of the printable area." -msgstr "" -"Określa, czy X / Y współrzędne położenia zerowego drukarki znajdują się w " -"środku obszaru wydruku." +msgstr "Określa, czy współrzędne zero X/Y znajdują się na środku pola wydruku." msgctxt "machine_center_is_zero label" msgid "Is center origin" -msgstr "Jest centralnym źródłem" +msgstr "Począt. na Środku" msgctxt "machine_depth description" msgid "The depth (Y-direction) of the printable area." @@ -1411,12 +1387,11 @@ msgstr "Głębokość (w kierunku Y) obszaru drukowania." msgctxt "machine_depth label" msgid "Machine depth" -msgstr "Głębokość drukarki" +msgstr "Głębokość Drukarki" msgctxt "machine_disallowed_areas description" msgid "A list of polygons with areas the print head is not allowed to enter." -msgstr "" -"Lista wielokątów z obszarów, które nie są dopuszczone do głowicy drukującej." +msgstr "Lista obszarów, we których głowica nie może się poruszać." msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -1427,44 +1402,44 @@ msgid "" "Gcode commands to be executed at the very end - separated by \n" "." msgstr "" -"Polecenia G-kodu są wykonywane na samym końcu - oddzielone \n" +"Polecenia G-code, które są wykonywane na samym końcu - oddzielone za " +"pomocą \n" "." msgctxt "machine_end_gcode label" msgid "End GCode" -msgstr "Koniec G-kodu" +msgstr "Końcowy G-code" msgctxt "machine_extruder_count description" msgid "" "Number of extruder trains. An extruder train is the combination of a feeder, " "bowden tube, and nozzle." msgstr "" -"Liczba pociągów wytłaczarek. Pociąg wytłaczający jest połączeniem podajnika, " -"rurki bowdenowej i dyszy." +"Liczba wózków esktruderów. Wózek ekstrudera to kombinacja podajnika, rurki " +"Bowden i dyszy." msgctxt "machine_extruder_count label" msgid "Number of Extruders" -msgstr "Numer głowicy drukującej." +msgstr "Liczba Ekstruderów" msgctxt "machine_filament_park_distance description" msgid "" "The distance from the tip of the nozzle where to park the filament when an " "extruder is no longer used." msgstr "" -"Odległość od końcówki dyszy, w którym włókno jest zaparkowany, gdy " -"wytłaczarka nie jest wykorzystywana." +"Odległość od końcówki dyszy, gdzie parkować głowicę gdy nie jest używana." msgctxt "machine_filament_park_distance label" msgid "Filament Park Distance" -msgstr "Odległość Parku filamentowego" +msgstr "Odległość Park. Filamentu" msgctxt "machine_gcode_flavor description" msgid "The type of gcode to be generated." -msgstr "Typ gcode, który ma zostać wygenerowany." +msgstr "Typ G-code jaki ma być generowany." msgctxt "machine_gcode_flavor label" msgid "Gcode flavour" -msgstr "G-kod wersja" +msgstr "Wersja G-code" msgctxt "machine_gcode_flavor option BFB" msgid "Bits from Bytes" @@ -1472,7 +1447,7 @@ msgstr "Bits from Bytes" msgctxt "machine_gcode_flavor option Griffin" msgid "Griffin" -msgstr "Nowicjusz" +msgstr "Griffin" msgctxt "machine_gcode_flavor option MACH3" msgid "Mach3" @@ -1488,7 +1463,7 @@ msgstr "RepRap (Marlin/Sprinter)" msgctxt "machine_gcode_flavor option RepRap (Volumatric)" msgid "RepRap (Volumetric)" -msgstr "RepRap (Volumetrisch)" +msgstr "RepRap (Objętościowy)" msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" @@ -1500,27 +1475,27 @@ msgstr "Ultimaker 2" msgctxt "machine_head_polygon description" msgid "A 2D silhouette of the print head (fan caps excluded)." -msgstr "2D kontur głowicy drukującej (bez nasadki wentylatora)." +msgstr "Sylwetka 2D głowicy drukującej (bez nasadki wentylatora)." msgctxt "machine_head_polygon label" msgid "Machine head polygon" -msgstr "Urządzenie głowica wielokąta" +msgstr "Obszar Głowicy Drukarki" msgctxt "machine_head_with_fans_polygon description" msgid "A 2D silhouette of the print head (fan caps included)." -msgstr "2D kontur głowicy drukującej (caps wentylatora w zestawie)." +msgstr "Sylwetka 2D głowicy drukującej (z nasadką wentylatora)." msgctxt "machine_head_with_fans_polygon label" msgid "Machine head & Fan polygon" -msgstr "Głowica urządzenia i wentylator wielokąta" +msgstr "Obszar Głowicy i Wentylatora Drukarki" msgctxt "machine_heat_zone_length description" msgid "" "The distance from the tip of the nozzle in which heat from the nozzle is " "transferred to the filament." msgstr "" -"Odległość od końcówki dyszy, w której ciepło z dyszy jest przenoszone do " -"włókna ciągłego." +"Odległość od końcówki dyszy, z której ciepło dyszy przenoszone jest do " +"filamentu." msgctxt "machine_heat_zone_length label" msgid "Heat zone length" @@ -1532,7 +1507,7 @@ msgstr "Czy maszyna ma podgrzewany stół?" msgctxt "machine_heated_bed label" msgid "Has heated build plate" -msgstr "Posiada grzany stół" +msgstr "Posiada podgrzewany stół" msgctxt "machine_height description" msgid "The height (Z-direction) of the printable area." @@ -1548,87 +1523,87 @@ msgstr "Maksymalne przyspieszenie dla silnika filamentu." msgctxt "machine_max_acceleration_e label" msgid "Maximum Filament Acceleration" -msgstr "Maksymalna przyspieszenie filamentu" +msgstr "Maksymalna Przysp. Filamentu" msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "Maksymalne przyspieszenie dla silnika w kierunku X." +msgstr "Maksymalne przyspieszenie dla silnika osi X" msgctxt "machine_max_acceleration_x label" msgid "Maximum Acceleration X" -msgstr "Maksymalne przyspieszenie X" +msgstr "Maksymalne Przyspieszenie X" msgctxt "machine_max_acceleration_y description" msgid "Maximum acceleration for the motor of the Y-direction." -msgstr "Maksymalne przyspieszenie dla silnika w kierunku Y." +msgstr "Maksymalne przyspieszenie dla silnika osi Y." msgctxt "machine_max_acceleration_y label" msgid "Maximum Acceleration Y" -msgstr "Maksymalne przyspieszenie Y" +msgstr "Maksymalne Przyspieszenie Y" msgctxt "machine_max_acceleration_z description" msgid "Maximum acceleration for the motor of the Z-direction." -msgstr "Maksymalne przyspieszenie dla silnika w kierunku Z." +msgstr "Maksymalne przyspieszenie dla silnika osi Z." msgctxt "machine_max_acceleration_z label" msgid "Maximum Acceleration Z" -msgstr " maksymalnie przyspieszenie Z" +msgstr "Maksymalnie Przyspieszenie Z" msgctxt "machine_max_feedrate_e description" msgid "The maximum speed of the filament." -msgstr "Maksymalna prędkość włókna." +msgstr "Maksymalna prędkość filamentu." msgctxt "machine_max_feedrate_e label" msgid "Maximum Feedrate" -msgstr "Maksymalny posuw" +msgstr "Maksymalna Prędk. Posuwu" msgctxt "machine_max_feedrate_x description" msgid "The maximum speed for the motor of the X-direction." -msgstr "Maksymalna prędkość silnika w kierunku X." +msgstr "Maksymalna prędkość silnika osi X." msgctxt "machine_max_feedrate_x label" msgid "Maximum Speed X" -msgstr "Maksymalna prędkość X" +msgstr "Maksymalna Prędkość X" msgctxt "machine_max_feedrate_y description" msgid "The maximum speed for the motor of the Y-direction." -msgstr "Maksymalna prędkość silnika w kierunku Y." +msgstr "Maksymalna prędkość silnika osi Y." msgctxt "machine_max_feedrate_y label" msgid "Maximum Speed Y" -msgstr "Maksymalna prędkość Y" +msgstr "Maksymalna Prędkość Y" msgctxt "machine_max_feedrate_z description" msgid "The maximum speed for the motor of the Z-direction." -msgstr "Maksymalna prędkość silnika w kierunku Z." +msgstr "Maksymalna prędkość silnika osi Z." msgctxt "machine_max_feedrate_z label" msgid "Maximum Speed Z" -msgstr "Maksymalna prędkość Z" +msgstr "Maksymalna Prędkość Z" msgctxt "machine_max_jerk_e description" msgid "Default jerk for the motor of the filament." -msgstr "Domyślny szarpnięcie dla silnika filamentu." +msgstr "Domyślny zryw dla silnika filamentu." msgctxt "machine_max_jerk_e label" msgid "Default Filament Jerk" -msgstr "Domyślny Jerk Filamentu" +msgstr "Domyślny Zryw Filamentu" msgctxt "machine_max_jerk_xy description" msgid "Default jerk for movement in the horizontal plane." -msgstr "Domyślny szarpnięcie za ruch w płaszczyźnie poziomej." +msgstr "Domyślny zryw dla ruchu w płaszczyźnie poziomej." msgctxt "machine_max_jerk_xy label" msgid "Default X-Y Jerk" -msgstr "Domyślna X-Y Jerk" +msgstr "Domyślny Zryw X-Y" msgctxt "machine_max_jerk_z description" msgid "Default jerk for the motor of the Z-direction." -msgstr "Domyślny szarpnięcie do silnika w kierunku Z." +msgstr "Domyślny zryw do silnika osi Z." msgctxt "machine_max_jerk_z label" msgid "Default Z Jerk" -msgstr "Domyślny Z Jerk" +msgstr "Domyślny Zryw Z" msgctxt "machine_min_cool_heat_time_window description" msgid "" @@ -1636,13 +1611,13 @@ msgid "" "Only when an extruder is not used for longer than this time will it be " "allowed to cool down to the standby temperature." msgstr "" -"Minimalny czas wytłaczarki musi być nieaktywny przed ochłodzeniem dyszy. " -"Dopiero, gdy wytłaczarka nie zostanie użyta dłużej niż w tym czasie " -"pozostanie ona ochłodzona do temperatury wstrzymania." +"Minimalny czas, w jakim ekstruder musi być nieużywany, aby schłodzić dyszę. " +"Dopiero, gdy ekstruder nie jest używany dłużej niż przez ten czas, będzie " +"można schłodzić dyszę do temp. czuwania." msgctxt "machine_min_cool_heat_time_window label" msgid "Minimal Time Standby Temperature" -msgstr "Minimalna temperatura czuwania w trybie gotowości" +msgstr "Minimalny Czas Temp. Czuwania" msgctxt "machine_minimum_feedrate description" msgid "The minimal movement speed of the print head." @@ -1650,11 +1625,11 @@ msgstr "Minimalna prędkość ruchu głowicy drukującej." msgctxt "machine_minimum_feedrate label" msgid "Minimum Feedrate" -msgstr "Minimalna prędkość posuwu" +msgstr "Minimalna Prędk. Posuwu" msgctxt "machine_name description" msgid "The name of your 3D printer model." -msgstr "Nazwa Twojego modelu drukarki 3D." +msgstr "Nazwa modelu twojej drukarki." msgctxt "machine_name label" msgid "Machine Type" @@ -1665,20 +1640,20 @@ msgid "" "The speed (°C/s) by which the nozzle cools down averaged over the window of " "normal printing temperatures and the standby temperature." msgstr "" -"Szybkość (° C / s.), Z którym dysza chłodzi średnio przy normalnym ciśnieniu " -"i temperaturach jest w stanie gotowości." +"Szybkość (° C/s.), z którą dysza chłodzi się - średnia z normlanej " +"temperatury druku i temperatury czuwania." msgctxt "machine_nozzle_cool_down_speed label" msgid "Cool down speed" -msgstr "Prędkość chłodzenia" +msgstr "Prędkość Chłodzenia" msgctxt "machine_nozzle_expansion_angle description" msgid "" "The angle between the horizontal plane and the conical part right above the " "tip of the nozzle." msgstr "" -"Kąt pomiędzy poziomą powierzchnią i częścią stożkową bezpośrednio powyżej " -"dyszy." +"Kąt pomiędzy poziomą powierzchnią a częścią stożkową bezpośrednio ponad " +"dyszą." msgctxt "machine_nozzle_expansion_angle label" msgid "Nozzle angle" @@ -1689,20 +1664,20 @@ msgid "" "The height difference between the tip of the nozzle and the lowest part of " "the print head." msgstr "" -"Różnica w wysokości pomiędzy końcówki dyszy i najniższej części głowicy " +"Różnica w wysokości pomiędzy końcówką dyszy a najniższą częścą głowicy " "drukującej." msgctxt "machine_nozzle_head_distance label" msgid "Nozzle length" -msgstr "Długość dysz" +msgstr "Długość dyszy" msgctxt "machine_nozzle_heat_up_speed description" msgid "" "The speed (°C/s) by which the nozzle heats up averaged over the window of " "normal printing temperatures and the standby temperature." msgstr "" -"Szybkość (° C / s.), Z którym dysza ogrzewa średnio przy normalnym ciśnieniu " -"i temperaturach jest w stanie gotowości." +"Szybkość (° C/s.), z którą dysza ogrzewa się - średnia z normlanej " +"temperatury druku i temperatury czuwania." msgctxt "machine_nozzle_heat_up_speed label" msgid "Heat up speed" @@ -1725,24 +1700,24 @@ msgid "" "Whether to control temperature from Cura. Turn this off to control nozzle " "temperature from outside of Cura." msgstr "" -"Do kontroli temperatury Cura. Wyłączyć tę funkcję, aby kontrolować " +"Czy kontrolować temperaturę przez Cura? Wyłącz tę funkcję, aby kontrolować " "temperaturę dyszy poza Cura." msgctxt "machine_nozzle_temp_enabled label" msgid "Enable Nozzle Temperature Control" -msgstr "Umożliwi kontrolę temperatury dyszy" +msgstr "Włącz Kontrolę Temp. Dyszy" msgctxt "machine_nozzle_tip_outer_diameter description" msgid "The outer diameter of the tip of the nozzle." -msgstr "Zewnętrzna średnica dyszy." +msgstr "Zewnętrzna średnica końcówki dyszy." msgctxt "machine_nozzle_tip_outer_diameter label" msgid "Outer nozzle diameter" -msgstr "Średnica dyszy zewnętrznej" +msgstr "Zewn. średnica dyszy" msgctxt "machine_settings description" msgid "Machine specific settings" -msgstr "Ustawienia specyficzne dla urządzenia" +msgstr "Specyficzne ustawienia drukarki" msgctxt "machine_settings label" msgid "Machine" @@ -1751,11 +1726,11 @@ msgstr "Drukarka" msgctxt "machine_shape description" msgid "" "The shape of the build plate without taking unprintable areas into account." -msgstr "Kształt stołu bez uwzględniania obszarów nieprzedstawnych/klamry itp." +msgstr "Kształt stołu bez uwzględniania obszarów niedrukowalnych." msgctxt "machine_shape label" msgid "Build plate shape" -msgstr "Wymiary stołu" +msgstr "Kształt stołu" msgctxt "machine_shape option elliptic" msgid "Elliptic" @@ -1770,8 +1745,8 @@ msgid "" "Whether to show the different variants of this machine, which are described " "in separate json files." msgstr "" -"Opcjonalnie wyświetlane są różne wersje tego urządzenia, które są opisane w " -"oddzielnych plikach JSON." +"Czy wyświetlać różna warianty drukarki, które są opisane w oddzielnych " +"plikach JSON?" msgctxt "machine_show_variants label" msgid "Show machine variants" @@ -1782,24 +1757,24 @@ msgid "" "Gcode commands to be executed at the very start - separated by \n" "." msgstr "" -"Polecenia Gkod są wykonywane od samego początku - oddzielone \n" -"." +"Polecenia G-code, które są wykonywane na samym początku - oddzielone za " +"pomocą " msgctxt "machine_start_gcode label" msgid "Start GCode" -msgstr "Rozpocznij G-kod" +msgstr "Początk. G-code" msgctxt "machine_use_extruder_offset_to_offset_coords description" msgid "Apply the extruder offset to the coordinate system." -msgstr "Zastosuj głowicę drukującą do przesunięcia układu współrzędnych." +msgstr "Zastosuj przesunięcie głowicy względem ." msgctxt "machine_use_extruder_offset_to_offset_coords label" msgid "Offset With Extruder" -msgstr "Przesunięcie głowicy drukującej" +msgstr "Przesunięcie Ekstrudera" msgctxt "machine_width description" msgid "The width (X-direction) of the printable area." -msgstr "Szerokość (w kierunku X) obszaru drukowania." +msgstr "Szerokość (w kierunku X) obszaru roboczego." msgctxt "machine_width label" msgid "Machine width" @@ -1810,12 +1785,12 @@ msgid "" "Randomly jitter while printing the outer wall, so that the surface has a " "rough and fuzzy look." msgstr "" -"Losowo jitter podczas drukowania zewnętrznej ściany, tak że powierzchnia ma " -"szorstki i rozmyty wygląd." +"Losowe drgania podczas drukowania zewnętrznej ściany, dzięki czemu " +"powierzchnia ma szorstki i rozmyty wygląd." msgctxt "magic_fuzzy_skin_enabled label" msgid "Fuzzy Skin" -msgstr "Nierówna skóra" +msgstr "Nierówna Skóra" msgctxt "magic_fuzzy_skin_point_density description" msgid "" @@ -1823,13 +1798,13 @@ msgid "" "that the original points of the polygon are discarded, so a low density " "results in a reduction of the resolution." msgstr "" -"Średnia gęstość punktów wprowadzonych na każdy wielokąt w warstwie. Zauważ, " +"Średnia gęstość punktów wprowadzonych na każdy wielokąt na warstwie. Zauważ, " "że oryginalne punkty wielokąta są odrzucane, a więc niska gęstość powoduje " "zmniejszenie rozdzielczości." msgctxt "magic_fuzzy_skin_point_density label" msgid "Fuzzy Skin Density" -msgstr "Gęstość nierównej skóry" +msgstr "Gęstość Nierównej Skóry" msgctxt "magic_fuzzy_skin_point_dist description" msgid "" @@ -1838,26 +1813,27 @@ msgid "" "high smoothness results in a reduction of the resolution. This value must be " "higher than half the Fuzzy Skin Thickness." msgstr "" -"Średnia odległość między punktami losowymi wprowadzonymi w każdym segmencie " +"Średnia odległość między losowymi punktami wprowadzonymi w każdym segmencie " "linii. Zwróć uwagę, że oryginalne punkty wielokąta są odrzucane, a zatem " "duża gładkość powoduje zmniejszenie rozdzielczości. Wartość ta musi być " -"większa niż połowa rozmytej grubości skóry." +"większa niż połowa Grubości Nierównej Skóry." msgctxt "magic_fuzzy_skin_point_dist label" msgid "Fuzzy Skin Point Distance" -msgstr "Plamki nierównej skóry" +msgstr "Odległ. między Punkt. Nierównej Skóry" msgctxt "magic_fuzzy_skin_thickness description" msgid "" "The width within which to jitter. It's advised to keep this below the outer " "wall width, since the inner walls are unaltered." msgstr "" -"Szerokość, w której ma się drgać. Zaleca się zachować ją poniżej zewnętrznej " -"szerokości ścianki, ponieważ wewnętrzne ściany nie uległy zmianie." +"Szerokość, w której będą wykonywane drgania. Zaleca się zachować ją poniżej " +"zewnętrznej szerokości ścianki, ponieważ wewnętrzne ściany nie ulegają " +"zmianie." msgctxt "magic_fuzzy_skin_thickness label" msgid "Fuzzy Skin Thickness" -msgstr "Grubość skóry niejednorodnego" +msgstr "Grubości Nierównej Skóry" msgctxt "magic_mesh_surface_mode description" msgid "" @@ -1867,23 +1843,23 @@ msgid "" "\"Both\" prints enclosed volumes like normal and any remaining polygons as " "surfaces." msgstr "" -"Traktuj model jako tylko powierzchnię, objętość lub objętość z luźnymi " -"powierzchniami. Zwykły tryb drukowania drukuje tylko zamknięte wolumeny. " -"\"Powierzchnia\" drukuje pojedynczą ścianę śledzącą powierzchnię siatki bez " -"wypełnienia, a nie górna / dolna skóra. \"Oba\" drukuje zamknięte tomy takie " +"Traktuj model tylko jako powierzchnię, bryłę lub bryłę z luźnymi " +"powierzchniami. Zwykły tryb drukowania drukuje tylko zamknięte bryły. " +"\"Powierzchnia\" drukuje pojedynczą ścianę śledząc powierzchnię siatki bez " +"wypełnienia i bez górnej/dolnej skóry. \"Oba\" drukuje zamknięte bryły takie " "jak zwykłe i wszelkie pozostałe wielokąty jako powierzchnie." msgctxt "magic_mesh_surface_mode label" msgid "Surface Mode" -msgstr "Tryb powierzchni" +msgstr "Tryb Powierzchni" msgctxt "magic_mesh_surface_mode option both" msgid "Both" -msgstr "Obie" +msgstr "Oba" msgctxt "magic_mesh_surface_mode option normal" msgid "Normal" -msgstr "Normalna" +msgstr "Normalny" msgctxt "magic_mesh_surface_mode option surface" msgid "Surface" @@ -1896,14 +1872,14 @@ msgid "" "into a single walled print with a solid bottom. This feature should only be " "enabled when each layer only contains a single part." msgstr "" -"Spirala wygładza ruch Z na zewnętrznej krawędzi. Powoduje to stały wzrost Z " -"w całym druku. Ta funkcja zamienia solidny model w pojedynczy, ścienny " -"nadruk z solidnym dnem. Ta funkcja powinna być włączona tylko wtedy, gdy " -"każda warstwa zawiera tylko jedną część." +"Spirala wygładzająca ruch w Z na zewnętrznej krawędzi. Powoduje to stały " +"wzrost Z w całym druku. Ta funkcja zamienia pełny model w pojedynczo ścienny " +"wydruk z pełnym dnem. Ta funkcja powinna być włączona tylko wtedy, gdy każda " +"warstwa zawiera tylko jedną część." msgctxt "magic_spiralize label" msgid "Spiralize Outer Contour" -msgstr "Zewnętrzne kontury po spirali" +msgstr "Spiralizuj Zewn. Kontur" msgctxt "material description" msgid "Material" @@ -1919,9 +1895,9 @@ msgid "" "gcode. When the start_gcode already contains build plate temperature " "commands Cura frontend will automatically disable this setting." msgstr "" -"Możliwość wstawienia polecenia do temperatury płyty drukarskiej na początku " -"kodu G. Jeśli start_gcode zawiera już polecenia dla temperatury płyty " -"drukarskiej, program Cura wyłącza to ustawienie automatycznie." +"Możliwość wstawienia poleceń temperatury stołu na początku G-code. Jeśli " +"start_gcode zawiera już polecenia dla temperatury stołu, program Cura " +"wyłącza to ustawienie automatycznie." msgctxt "material_bed_temp_prepend label" msgid "Include build plate temperature" @@ -1932,8 +1908,8 @@ msgid "" "Whether to insert a command to wait until the build plate temperature is " "reached at the start." msgstr "" -"Czy wstawić komendę, poczekaj, aż temperatura stołu zostanie osiągnięta na " -"początku." +"Czy wstawić na początku komendę, czekającą aż temperatura stołu zostanie " +"osiągnięta." msgctxt "material_bed_temp_wait label" msgid "Wait for build plate heatup" @@ -1944,20 +1920,20 @@ msgid "" "The temperature used for the heated build plate. If this is 0, the bed will " "not heat up for this print." msgstr "" -"Temperatura stosowana przy ogrzewanej płytce. Jeśli jest to 0, łóżko nie " +"Temperatura stosowana przy podgrzewanym stole. Jeśli jest to 0, stół nie " "rozgrzeje się dla tego wydruku." msgctxt "material_bed_temperature label" msgid "Build Plate Temperature" -msgstr "Konstruuj temperaturę stołu" +msgstr "Temperatura Stołu" msgctxt "material_bed_temperature_layer_0 description" msgid "The temperature used for the heated build plate at the first layer." -msgstr "Temperatura stosowana przy ogrzewanym stole w pierwszej warstwie." +msgstr "Temperatura stosowana przy podgrzewanym stole na pierwszej warstwie." msgctxt "material_bed_temperature_layer_0 label" msgid "Build Plate Temperature Initial Layer" -msgstr "Temperatura stołu na pierwszej warstwie" +msgstr "Temp. Stołu na Pierw. Warstwie" msgctxt "material_diameter description" msgid "" @@ -1976,31 +1952,31 @@ msgid "" "The extra speed by which the nozzle cools while extruding. The same value is " "used to signify the heat up speed lost when heating up while extruding." msgstr "" -"Dodatkowa szybkość, w wyniku której dysze chłodzą się podczas wytłaczania. " -"Ta sama wartość jest używana do oznaczania szybkości nagrzewania utraconej " -"podczas nagrzewania podczas wytłaczania." +"Dodatkowa szybkość, w wyniku której dysze chłodzą się podczas ekstruzji. Ta " +"sama wartość jest używana do oznaczania szybkości utraty ciepła podczas " +"nagrzewania w czasie ekstruzji." msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" -msgstr "Regulatory prędkości do chłodzenia na wytłaczanie" +msgstr "Współczynnik chłodz. podczas Ekstruzji" msgctxt "material_final_print_temperature description" msgid "" "The temperature to which to already start cooling down just before the end " "of printing." msgstr "" -"Temperatura, po której zaczyna się chłodzenie tuż przed końcem drukowania." +"Temperatura, od której zaczyna się chłodzenie tuż przed końcem drukowania." msgctxt "material_final_print_temperature label" msgid "Final Printing Temperature" -msgstr "Temperatura druku końcowego" +msgstr "Końcowa Temp. Druku" msgctxt "material_flow description" msgid "" "Flow compensation: the amount of material extruded is multiplied by this " "value." msgstr "" -"Kompensacja przepływu: ilość materiału wytłaczanego jest mnożona przez tę " +"Kompensacja przepływu: ilość ekstrudowanego materiału jest mnożona przez tę " "wartość." msgctxt "material_flow label" @@ -2012,7 +1988,7 @@ msgid "" "Change the temperature for each layer automatically with the average flow " "speed of that layer." msgstr "" -"Zmienić temperaturę każdej warstwy automatycznie przy średniej prędkości " +"Zmień temperaturę każdej warstwy automatycznie przy średniej prędkości " "przepływu tej warstwy." msgctxt "material_flow_dependent_temperature label" @@ -2024,20 +2000,20 @@ msgid "" "Data linking material flow (in mm3 per second) to temperature (degrees " "Celsius)." msgstr "" -"Dane łączące przepływ materiału (w mm3 na sekundę) do temperatury (stopni " +"Dane łączące przepływ materiału (w mm3 na sekundę) z temperaturą (stopnie " "Celsjusza)." msgctxt "material_flow_temp_graph label" msgid "Flow Temperature Graph" -msgstr "Wykres temperatury przepływu" +msgstr "Wykres Temp. Przepływu" msgctxt "material_guid description" msgid "GUID of the material. This is set automatically. " -msgstr "GUID materiału. To jest ustawiana automatycznie." +msgstr "GUID materiału. To jest ustawiana automatycznie " msgctxt "material_guid label" msgid "Material GUID" -msgstr "Materiał-GUID" +msgstr "GUID Materiału" msgctxt "material_initial_print_temperature description" msgid "" @@ -2049,7 +2025,7 @@ msgstr "" msgctxt "material_initial_print_temperature label" msgid "Initial Printing Temperature" -msgstr "Początkowa temperatura druku" +msgstr "Początkowa Temp. Druku" msgctxt "material_print_temp_prepend description" msgid "" @@ -2057,9 +2033,9 @@ msgid "" "When the start_gcode already contains nozzle temperature commands Cura " "frontend will automatically disable this setting." msgstr "" -"Możliwość wstawienia polecenia do temperatury dyszy na początku kodu G. " -"Jeżeli start_gcode już zawiera polecenia do temperatury dyszy, program Cura " -"wyłączenie tego ustawienia automatyczne." +"Możliwość wstawienia polecenia temperatury dyszy na początku G-code. Jeżeli " +"start_gcode już zawiera polecenia temperatury dyszy, program Cura wyłączy " +"tego ustawienie automatycznie." msgctxt "material_print_temp_prepend label" msgid "Include material temperatures" @@ -2079,7 +2055,7 @@ msgstr "Temperatura stosowana do drukowania." msgctxt "material_print_temperature label" msgid "Printing Temperature" -msgstr "Temperatura druku" +msgstr "Temperatura Druku" msgctxt "material_print_temperature_layer_0 description" msgid "" @@ -2091,7 +2067,7 @@ msgstr "" msgctxt "material_print_temperature_layer_0 label" msgid "Printing Temperature Initial Layer" -msgstr "Temperatura początkowej warstwy" +msgstr "Temp. Druku Początk. Warstwy" msgctxt "material_standby_temperature description" msgid "" @@ -2101,19 +2077,19 @@ msgstr "Temperatura dyszy, gdy inne dysze są obecnie używane do drukowania." msgctxt "material_standby_temperature label" msgid "Standby Temperature" -msgstr "Temperatura w trybie czuwania" +msgstr "Temperatura Czuwania" msgctxt "max_feedrate_z_override description" msgid "" "The maximum speed with which the build plate is moved. Setting this to zero " "causes the print to use the firmware defaults for the maximum z speed." msgstr "" -"Maksymalna prędkość przesuwu płyty nośnej. Ustawienie na zero powoduje, że " -"druk używa domyślnych ustawień oprogramowania dla maksymalnej prędkości z." +"Maksymalna prędkość przesuwu stołu. Ustawienie na zero powoduje, że druk " +"używa domyślnych ustawień oprogramowania dla maksymalnej prędkości z." msgctxt "max_feedrate_z_override label" msgid "Maximum Z Speed" -msgstr "Prędkość maksymalna Z" +msgstr "Maksymalna Prędk. Z" msgctxt "max_skin_angle_for_expansion description" msgid "" @@ -2123,19 +2099,18 @@ msgid "" "vertical slope. An angle of 0° is horizontal, while an angle of 90° is " "vertical." msgstr "" -"Górne i / lub dolne powierzchnie przedmiotu o kącie większym niż to " -"ustawienie nie będą miały rozszerzonego górnego / dolnego rozdarcia. Pozwala " -"to uniknąć powiększania wąskich obszarów ścian, które powstają, gdy " -"powierzchnia modelu ma w pobliżu pionowe nachylenie. Kąt 0 ° jest poziomy, a " -"kąt 90 ° jest pionowy." +"Górne i/lub dolne powierzchnie przedmiotu o kącie większym niż to ustawienie " +"nie będą miały rozszerzonego górnej/dolnej skóry. Pozwala to uniknąć " +"powiększania wąskich ścian, które powstają, gdy powierzchnia modelu ma " +"blisko pionowe nachylenie. Kąt 0 ° jest poziomy, a kąt 90 ° jest pionowy." msgctxt "max_skin_angle_for_expansion label" msgid "Maximum Skin Angle for Expansion" -msgstr "Maksymalny kąt rozciągania ścian" +msgstr "Maks. Kąt Rozciągania Ścian" msgctxt "mesh_position_x description" msgid "Offset applied to the object in the x direction." -msgstr "Przesunięcie wykorzystywane do obiektu w kierunku X" +msgstr "Przesunięcie zastosowane dla obiektu w kierunku X." msgctxt "mesh_position_x label" msgid "Mesh position x" @@ -2143,7 +2118,7 @@ msgstr "Pozycja siatki X" msgctxt "mesh_position_y description" msgid "Offset applied to the object in the y direction." -msgstr "Przesunięcie wykorzystywane do obiektu w kierunku Y." +msgstr "Przesunięcie zastosowane dla obiektu w kierunku Y." msgctxt "mesh_position_y label" msgid "Mesh position y" @@ -2154,8 +2129,8 @@ msgid "" "Offset applied to the object in the z direction. With this you can perform " "what was used to be called 'Object Sink'." msgstr "" -"Przesunięcie wykorzystywane do obiektu w kierunku Z.. Aby wykonać procedurę " -"zastosowano „niższy obiekt” w znaczeniu." +"Przesunięcie zastosowane dla obiektu w kierunku Z. Za pomocą tego możesz " +"sprecyzować co nazywamy 'Zatopieniem Obiektu." msgctxt "mesh_position_z label" msgid "Mesh position z" @@ -2165,20 +2140,20 @@ msgctxt "mesh_rotation_matrix description" msgid "" "Transformation matrix to be applied to the model when loading it from file." msgstr "" -"Matryca transformacji, która ma być zastosowana do modelu podczas ładowania " -"z pliku." +"Forma przesunięcia, która ma być zastosowana do modelu podczas ładowania z " +"pliku." msgctxt "mesh_rotation_matrix label" msgid "Mesh Rotation Matrix" -msgstr "Matryca rotacji siatki" +msgstr "Forma Obrotu Siatki" msgctxt "meshfix description" msgid "category_fixes" -msgstr "Poprawki kategorii" +msgstr "poprawki_kategorii" msgctxt "meshfix label" msgid "Mesh Fixes" -msgstr "Poprawki siatki" +msgstr "Poprawki Siatki" msgctxt "meshfix_extensive_stitching description" msgid "" @@ -2187,12 +2162,12 @@ msgid "" "time." msgstr "" "Szerokie szwy próbują zszywać otwarte otwory w siatce przez zamknięcie " -"otworu dotykiem wielokątów. Ta opcja może znacznie wydłużyć czas " +"otworów stykającymi się wielokątami. Ta opcja może znacznie wydłużyć czas " "przetwarzania." msgctxt "meshfix_extensive_stitching label" msgid "Extensive Stitching" -msgstr "Szerokie szwy" +msgstr "Poszerzające Zszywanie" msgctxt "meshfix_keep_open_polygons description" msgid "" @@ -2202,13 +2177,13 @@ msgid "" "everything else fails to produce proper GCode." msgstr "" "Zwykle Cura próbuje zszywać małe dziury w siatce i usunąć części warstwy z " -"dużymi otworami. Włączenie tej opcji powoduje zatrzymanie tych części, " -"których nie można zszywać. Ta opcja powinna być używana jako ostatnia opcja, " -"gdy wszystko inne nie dostarczy właściwej GCode." +"dużymi otworami. Włączenie tej opcji powoduje zostawienie tych części, " +"których nie można zszywać. Ta opcja powinna być używana jako ostatnia deska " +"ratunku, gdy wszystko inne nie dostarczy właściwego G-code." msgctxt "meshfix_keep_open_polygons label" msgid "Keep Disconnected Faces" -msgstr "Zachowaj rozłączone twarze" +msgstr "Zachowaj Rozłączone Pow." msgctxt "meshfix_union_all description" msgid "" @@ -2216,13 +2191,13 @@ msgid "" "and print the volumes as one. This may cause unintended internal cavities to " "disappear." msgstr "" -"Zignoruj geometrię wewnętrzną wynikającą z nakładania się objętości w siatce " -"i wydrukuj ją jako jedną. Może to spowodować zniknięcie niezamierzonych " +"Zignoruj geometrię wewnętrzną wynikającą z nakładania się brył w siatce i " +"wydrukuj ją jako jedną. Może to spowodować zniknięcie niezamierzonych " "wewnętrznych ubytków." msgctxt "meshfix_union_all label" msgid "Union Overlapping Volumes" -msgstr "Zwielokrotniające się tomy" +msgstr "Nakładanie się Związanych Brył" msgctxt "meshfix_union_all_remove_holes description" msgid "" @@ -2232,21 +2207,21 @@ msgid "" msgstr "" "Usuń otwory w każdej warstwie i zachowuj tylko zewnętrzny kształt. Zignoruje " "to niewidoczną wewnętrzną geometrię. Ignoruje jednak otwory warstw, które " -"można oglądać z góry lub do dołu." +"można zobaczyć z góry lub do dołu." msgctxt "meshfix_union_all_remove_holes label" msgid "Remove All Holes" -msgstr "Usuń wszystkie otwory" +msgstr "Usuń Wszystkie Otwory" msgctxt "min_infill_area description" msgid "Don't generate areas of infill smaller than this (use skin instead)." msgstr "" -"Nie wytwarzaj obszarów wypełnienia mniejszych niż ten (Zamiast tego używać " +"Nie generuj obszarów wypełnienia mniejszych niż to (zamiast tego używaj " "skóry)." msgctxt "min_infill_area label" msgid "Minimum Infill Area" -msgstr "Minimalny obszar wypełnienia" +msgstr "Min. Obszar Wypełn." msgctxt "min_skin_width_for_expansion description" msgid "" @@ -2254,13 +2229,13 @@ msgid "" "narrow skin areas that are created when the model surface has a slope close " "to the vertical." msgstr "" -"Obszary ściany, które są węższe niż minimalna szerokość nie zostanie " -"poszerzona. W ten sposób unika że obcisłe zewnętrzne obszary ścian są " -"rozszerzone, wynik, gdy powierzchnia modelu mającą niemal pionowe nachylenie." +"Obszary skóry, które są węższe niż to, nie zostaną poszerzone. W ten sposób " +"unikamy rozszerzania wąskich skór, które są tworzone, kiedy powierzchnia " +"jest blisko pionowi." msgctxt "min_skin_width_for_expansion label" msgid "Minimum Skin Width for Expansion" -msgstr "Minimalna szerokość zewnętrzna warstwa ekspansji" +msgstr "Min. Szerok. Skóry do Poszerzenia" msgctxt "mold_angle description" msgid "" @@ -2270,18 +2245,18 @@ msgid "" msgstr "" "Kąt zwisania ścian zewnętrznych utworzonych dla formy. 0 ° spowoduje, że " "powłoka zewnętrzna formy będzie pionowa, a 90 ° sprawi, że na zewnątrz " -"modelu znajdzie się kontur modelu." +"modelu podąży za konturem modelu." msgctxt "mold_angle label" msgid "Mold Angle" -msgstr "Kąt formy" +msgstr "Kąt Formy" msgctxt "mold_enabled description" msgid "" "Print models as a mold, which can be cast in order to get a model which " "resembles the models on the build plate." msgstr "" -"Wydrukuj modele jako formę, którą można wyrzucić w celu uzyskania modelu, " +"Wydrukuj modele jako formę, którą można wyrzucić w celu uzyskania odlewu, " "który przypomina modele na płycie." msgctxt "mold_enabled label" @@ -2291,43 +2266,43 @@ msgstr "Forma" msgctxt "mold_roof_height description" msgid "The height above horizontal parts in your model which to print mold." msgstr "" -"Wysokość nad poziomymi częściami w modelu, które umożliwiają drukowanie " -"formy." +"Wysokość nad poziomymi częściami w modelu, które będą drukowanie jako formy." msgctxt "mold_roof_height label" msgid "Mold Roof Height" -msgstr "Wzrost wysokości dachu" +msgstr "Wysokość Dachu Formy" msgctxt "mold_width description" msgid "" "The minimal distance between the ouside of the mold and the outside of the " "model." msgstr "" -"Minimalna odległość między zewnętrzną stroną śmiałego i zewnętrznego modelu." +"Minimalna odległość między zewnętrzną stroną formy i zewnętrzną stroną " +"modelu." msgctxt "mold_width label" msgid "Minimal Mold Width" -msgstr "Minimalna szerokość formy" +msgstr "Min. Szerokość Formy" msgctxt "multiple_mesh_overlap description" msgid "" "Make meshes which are touching each other overlap a bit. This makes them " "bond together better." msgstr "" -"Utwórz siatki, które się dotykają, zachodzą na siebie. To sprawia, że lepiej " -"się łączą." +"Spowoduj, że siatki, które się dotykają będą na siebie trochę nachodzić. To " +"sprawia, że lepiej się łączą." msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" -msgstr "Połączone okręgi się pokrywają" +msgstr "Połączone Siatki Pokrywają się" msgctxt "nozzle_disallowed_areas description" msgid "A list of polygons with areas the nozzle is not allowed to enter." -msgstr "Lista wielokątów z obszarami, na które dysze nie mogą wchodzić." +msgstr "Lista obszarów, w które dysze nie mogą wjeżdżać." msgctxt "nozzle_disallowed_areas label" msgid "Nozzle Disallowed Areas" -msgstr "Obszary niedozwolone w dyszy" +msgstr "Niedozwolone Obszary Dyszy" msgctxt "ooze_shield_angle description" msgid "" @@ -2335,21 +2310,21 @@ msgid "" "vertical, and 90 degrees being horizontal. A smaller angle leads to less " "failed ooze shields, but more material." msgstr "" -"Maksymalny kąt, jaki ma w osłonie osłony. Przy 0 stopniach jest pionowa i 90 " -"stopni w poziomie. Mniejszy kąt prowadzi do mniej nieudanych ekranów, ale " -"więcej materiału." +"Maksymalny kąt, jaki będzie mieć część w tarczy wycierającej. Przy 0 " +"stopniach jest pionowa i 90 stopni jest pozioma. Mniejszy kąt prowadzi do " +"mniej nieudanych osłon, ale używa więcej materiału." msgctxt "ooze_shield_angle label" msgid "Ooze Shield Angle" -msgstr "Kąt osłony tarcia" +msgstr "Kąt Osłony Wycierającej" msgctxt "ooze_shield_dist description" msgid "Distance of the ooze shield from the print, in the X/Y directions." -msgstr "Odległość od osłony śluzu od nadruku, w kierunkach X / Y." +msgstr "Odległość od osłony wycierającej do wydruku, w kierunkach X/Y." msgctxt "ooze_shield_dist label" msgid "Ooze Shield Distance" -msgstr " Odległość osłony tarczy" +msgstr "Odległ. Osłony Wycierającej" msgctxt "ooze_shield_enabled description" msgid "" @@ -2357,13 +2332,12 @@ msgid "" "is likely to wipe a second nozzle if it's at the same height as the first " "nozzle." msgstr "" -"Włączyć zewnętrzną osłonę. Powstanie powłoka wokół modelu, która " -"prawdopodobnie wycierpie drugą dyszę, jeśli jest na tej samej wysokości, co " -"pierwsza dysza." +"Włączyć zewnętrzną osłonę. Powstanie powłoka wokół modelu, która będzie " +"czyściła drugą dyszę, jeśli jest na tej samej wysokości, co pierwsza dysza." msgctxt "ooze_shield_enabled label" msgid "Enable Ooze Shield" -msgstr "Włącz osłony tarcia" +msgstr "Włącz Osłonę Wycierającą" msgctxt "outer_inset_first description" msgid "" @@ -2374,12 +2348,12 @@ msgid "" msgstr "" "Drukuje ściany w kolejności od zewnątrz do wewnątrz, gdy jest włączona. Może " "to poprawić dokładność wymiarów w modelach X i Y przy użyciu plastiku o " -"wysokiej lepkości, takiego jak ABS; Może jednak zmniejszyć jakość druku " +"wysokiej lepkości, takiego jak ABS; może jednak zmniejszyć jakość druku " "zewnętrznego, zwłaszcza na zwisach." msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" -msgstr "Zewnętrzne przed ścianami wewnętrznymi" +msgstr "Zewn. Ściany przed Wewn." msgctxt "platform_adhesion description" msgid "Adhesion" @@ -2387,7 +2361,7 @@ msgstr "Przyczepność" msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "Zbuduj przyczepność płyt" +msgstr "Popraw Przycz. Stołu" msgctxt "prime_blob_enable description" msgid "" @@ -2396,38 +2370,38 @@ msgid "" "nozzle before printing. Printing Brim or Skirt can act like priming too, in " "which case turning this setting off saves some time." msgstr "" -"Czy przenieść włókno z blobem przed drukowaniem. Po włączeniu tego " -"ustawienia upewnij się, że wytłaczarka ma materiał gotowy do dyszy przed " -"drukowaniem. Drukowanie Brim lub Skirt może działać jak gruntowanie, w takim " -"przypadku wyłączenie tego ustawienia oszczędza trochę czasu." +"Czy wyczyścić filament z \"blobem\" przed drukowaniem? Włączenie tej opcji " +"powoduje, że upewni się czy w materiał jest gotowy w ekstruderze przed " +"drukowaniem. Drukowanie Obrysu lub Obwódki może działać także jako " +"czyszczenie, w takim przypadku wyłączenie tej opcji oszczędzi trochę czasu." msgctxt "prime_blob_enable label" msgid "Enable Prime Blob" -msgstr "Włącz Prime Blob" +msgstr "Włącz Czyszcz. \"Blob\"" msgctxt "prime_tower_enable description" msgid "" "Print a tower next to the print which serves to prime the material after " "each nozzle switch." msgstr "" -"Wydrukuj wieżę obok wydruku, która służy do napełniania materiału po każdym " -"przełączniku dyszy." +"Wydrukuj wieżę obok wydruku, która służy do zmiany materiału po każdym " +"przełączeniu dyszy." msgctxt "prime_tower_enable label" msgid "Enable Prime Tower" -msgstr "Włącz Prime Tower" +msgstr "Włącz Wieżę Czyszcz." msgctxt "prime_tower_flow description" msgid "" "Flow compensation: the amount of material extruded is multiplied by this " "value." msgstr "" -"Kompensacja przepływu: ilość materiału wytłaczanego jest mnożona przez tę " +"Kompensacja przepływu: ilość ekstrudowanego materiału jest mnożona przez tę " "wartość." msgctxt "prime_tower_flow label" msgid "Prime Tower Flow" -msgstr "Przepływ/Flow Prime Tower " +msgstr "Przepływ Wieży Czyszcz." msgctxt "prime_tower_line_width description" msgid "Width of a single prime tower line." @@ -2435,67 +2409,67 @@ msgstr "Szerokość pojedynczej linii wieży." msgctxt "prime_tower_line_width label" msgid "Prime Tower Line Width" -msgstr "Szerokość linii rzędu głównej wieży" +msgstr "Szerokość Linii Wieży Czyszcz." msgctxt "prime_tower_min_volume description" msgid "" "The minimum volume for each layer of the prime tower in order to purge " "enough material." msgstr "" -"Minimalna objętość każdej warstwy wieży podstawowej w celu oczyszczenia " -"wystarczającego materiału." +"Minimalna objętość każdej warstwy wieży czyszczącej w celu oczyszczenia " +"wystarczającej ilości materiału." msgctxt "prime_tower_min_volume label" msgid "Prime Tower Minimum Volume" -msgstr "Minimalna objętość Prime Tower" +msgstr "Min. Objętość Wieży Czyszcz." msgctxt "prime_tower_position_x description" msgid "The x coordinate of the position of the prime tower." -msgstr "Współrzędna X położenia pierwszej wieży." +msgstr "Współrzędna X położenia wieży czyszczącej." msgctxt "prime_tower_position_x label" msgid "Prime Tower X Position" -msgstr "Pozycja Prime Tower X" +msgstr "Pozycja Wieży Czyszcz. X" msgctxt "prime_tower_position_y description" msgid "The y coordinate of the position of the prime tower." -msgstr "Współrzędna Y położenia pierwszej wieży." +msgstr "Współrzędna Y położenia wieży czyszczącej." msgctxt "prime_tower_position_y label" msgid "Prime Tower Y Position" -msgstr "Pozycja Prime Tower Y" +msgstr "Pozycja Wieży Czyszcz. Y" msgctxt "prime_tower_size description" msgid "The width of the prime tower." -msgstr "Szerokość wieży głównej." +msgstr "Szerokość wieży czyszczącej." msgctxt "prime_tower_size label" msgid "Prime Tower Size" -msgstr "Rozmiar Prime Tower" +msgstr "Rozmiar Wieży Czyszcz." msgctxt "prime_tower_wall_thickness description" msgid "" "The thickness of the hollow prime tower. A thickness larger than half the " "Prime Tower Minimum Volume will result in a dense prime tower." msgstr "" -"Grubość pustej wieży. Grubość większa niż połowa minimalnej objętości Prime " -"Tower spowoduje, że wieża o dużej gęstości." +"Grubość pustej wieży czyszczącej. Grubość większa niż połowa minimalnej " +"objętości wieży czyszczącej spowoduje, że wieża będzie miała dużą gęstość." msgctxt "prime_tower_wall_thickness label" msgid "Prime Tower Thickness" -msgstr "Grubość Prime Tower" +msgstr "Grubość Wieży Czyszcz." msgctxt "prime_tower_wipe_enabled description" msgid "" "After printing the prime tower with one nozzle, wipe the oozed material from " "the other nozzle off on the prime tower." msgstr "" -"Po wydrukowaniu podstawowej wieży jedną dyszą przetrzyj wytłoczony materiał " -"z drugiej dyszy na główną wieżę." +"Po wydrukowaniu podstawowej wieży jedną dyszą, wytrzyj wytłoczony materiał z " +"drugiej dyszy o wieżę czyszczącą." msgctxt "prime_tower_wipe_enabled label" msgid "Wipe Inactive Nozzle on Prime Tower" -msgstr "Wytrzeć nieaktywną dyszę na Prime Tower" +msgstr "Wytrzyj Nieuż. Dyszą o Wieże Czyszcz." msgctxt "print_sequence description" msgid "" @@ -2505,15 +2479,15 @@ msgid "" "between and all models are lower than the distance between the nozzle and " "the X/Y axes." msgstr "" -"Czy drukować wszystkie modele po jednej warstwie lub poczekać na zakończenie " -"jednego modelu, zanim przejdziesz do następnego. Jedno w trybie czasu jest " -"możliwe tylko wtedy, gdy wszystkie modele są oddzielone w taki sposób, aby " -"cała głowica drukująca mogła się poruszać między wszystkimi modelami niższa " -"niż odległość między dyszą a osiami X / Y." +"Czy drukować wszystkie modele po jednej warstwie, czy poczekać na " +"zakończenie jednego modelu, przed przejściem do następnego. Tryb Jeden na " +"raz jest możliwy, gdy wszystkie modele są oddzielone w taki sposób, aby cała " +"głowica drukująca mogła się poruszać między wszystkimi modelami i są one " +"niższe niż odległość pomiędzy dyszą i osiami X/Y." msgctxt "print_sequence label" msgid "Print Sequence" -msgstr "Wydrukuj sekwencję" +msgstr "Sekwencja Wydruku" msgctxt "print_sequence option all_at_once" msgid "All at Once" @@ -2521,15 +2495,15 @@ msgstr "Wszystko na raz" msgctxt "print_sequence option one_at_a_time" msgid "One at a Time" -msgstr "Jedno na raz" +msgstr "Jeden na raz" msgctxt "raft_acceleration description" msgid "The acceleration with which the raft is printed." -msgstr "Przyspieszenie, z jakim tratwa jest wydrukowana." +msgstr "Przyspieszenie, z jakim tratwa jest drukowana." msgctxt "raft_acceleration label" msgid "Raft Print Acceleration" -msgstr "Przyspieszenie druku tratwy" +msgstr "Przysp. Druku Tratwy" msgctxt "raft_airgap description" msgid "" @@ -2537,21 +2511,21 @@ msgid "" "the first layer is raised by this amount to lower the bonding between the " "raft layer and the model. Makes it easier to peel off the raft." msgstr "" -"Różnica między końcową warstwą tratwy a pierwszą warstwą modelu. Tylko ta " -"pierwsza warstwa jest podnoszona o tę ilość w celu zmniejszenia wiązania " -"pomiędzy warstwą tratwą a modelem. Ułatwia odrywanie tratwy." +"Przerwa pomiędzy ostatnią warstwą tratwy a pierwszą warstwą modelu. Tylko ta " +"pierwsza warstwa jest podnoszona o tę wartość w celu zmniejszenia wiązania " +"pomiędzy warstwą tratwy a modelem. Ułatwia to odrywanie tratwy." msgctxt "raft_airgap label" msgid "Raft Air Gap" -msgstr "Luki w powietrzu" +msgstr "Przerwa Tratwy" msgctxt "raft_base_acceleration description" msgid "The acceleration with which the base raft layer is printed." -msgstr "Przyspieszenie, z jaką drukowana jest warstwa podstawowej tratwy." +msgstr "Przyspieszenie, z jakim drukowana jest podstawowa warstwa tratwy." msgctxt "raft_base_acceleration label" msgid "Raft Base Print Acceleration" -msgstr "Przyspieszenie druku tratwy bazy" +msgstr "Przysp. Podst. Warstwy Tratwy" msgctxt "raft_base_fan_speed description" msgid "The fan speed for the base raft layer." @@ -2559,39 +2533,39 @@ msgstr "Prędkość wentylatora dla podstawowej warstwy tratwy." msgctxt "raft_base_fan_speed label" msgid "Raft Base Fan Speed" -msgstr "Prędkość wentylatora podstawy tratwy" +msgstr "Prędk. Went. Podst. Tratwy" msgctxt "raft_base_jerk description" msgid "The jerk with which the base raft layer is printed." -msgstr "Funkcja szarpnięcie w której dolna warstwa Tratwa wydrukowaniu." +msgstr "Zryw, z którym drukowana jest podstawowa warstwa tratwy." msgctxt "raft_base_jerk label" msgid "Raft Base Print Jerk" -msgstr "Funkcja Print szarpnięcie baza Tratwa" +msgstr "Zryw Podst. Tratwy" msgctxt "raft_base_line_spacing description" msgid "" "The distance between the raft lines for the base raft layer. Wide spacing " "makes for easy removal of the raft from the build plate." msgstr "" -"Odległość pomiędzy linami tratwiowymi dla warstwy podstawowej tratwy. " -"Szerokie odstępy ułatwiają usuwanie tratwy z płytki." +"Odległość pomiędzy linami tratwy na podstawowej warstwie tratwy. Szerokie " +"odstępy ułatwiają usuwanie tratwy ze stołu." msgctxt "raft_base_line_spacing label" msgid "Raft Line Spacing" -msgstr "Rozstaw linii tratw" +msgstr "Rozstaw Linii Tratwy" msgctxt "raft_base_line_width description" msgid "" "Width of the lines in the base raft layer. These should be thick lines to " "assist in build plate adhesion." msgstr "" -"Szerokość linii w podstawowej warstwie tratwy. Powinny być to grube linie, " -"które pomogą w przyczepianiu do płyt budowlanych." +"Szerokość linii na podstawowej warstwie tratwy. Powinny być to grube linie, " +"które pomogą w przyczepności do stołu." msgctxt "raft_base_line_width label" msgid "Raft Base Line Width" -msgstr "Szerokość linii podstawy tratwy" +msgstr "Szerokość Linii Podst. Tratwy" msgctxt "raft_base_speed description" msgid "" @@ -2599,25 +2573,25 @@ msgid "" "quite slowly, as the volume of material coming out of the nozzle is quite " "high." msgstr "" -"Prędkość, w jakiej jest wydrukowana warstwa podstawowej tratwy. Powinno być " -"drukowane dość wolno, ponieważ objętość materiału wydobywającego się z dyszy " +"Prędkość, z jaką drukowana jest podstawowa warstwa tratwy. Powinna być " +"drukowana dość wolno, ponieważ objętość materiału wydobywającego się z dyszy " "jest dość duża." msgctxt "raft_base_speed label" msgid "Raft Base Print Speed" -msgstr "Prędkość druku do bazy tratwy" +msgstr "Prędk. Druku Podst. Tratwy" msgctxt "raft_base_thickness description" msgid "" "Layer thickness of the base raft layer. This should be a thick layer which " "sticks firmly to the printer build plate." msgstr "" -"Grubość warstwy podstawowej warstwy tratwy. Powinna to być gruba warstwa, " -"która mocno przykleja się do płyty do budowy drukarki." +"Grubość podstawowej warstwy tratwy. Powinna to być gruba warstwa, która " +"mocno przykleja się do stołu drukarki." msgctxt "raft_base_thickness label" msgid "Raft Base Thickness" -msgstr "Grubość podstawy tratwy" +msgstr "Grubość Podstawy Tratwy" msgctxt "raft_fan_speed description" msgid "The fan speed for the raft." @@ -2625,15 +2599,15 @@ msgstr "Prędkość wentylatora dla tratwy." msgctxt "raft_fan_speed label" msgid "Raft Fan Speed" -msgstr "Prędkość wentylatora dla tratwy" +msgstr "Prędk. Went. Tratwa" msgctxt "raft_interface_acceleration description" msgid "The acceleration with which the middle raft layer is printed." -msgstr "Przyspieszenie, z jaką drukuje się środkową warstwę tratwy." +msgstr "Przyspieszenie, z jakim drukowana jest środkowa warstwa tratwy." msgctxt "raft_interface_acceleration label" msgid "Raft Middle Print Acceleration" -msgstr "Przyspieszenie drukowania środkowego tratwy" +msgstr "Przysp. Druku Środka Tratwy" msgctxt "raft_interface_fan_speed description" msgid "The fan speed for the middle raft layer." @@ -2641,15 +2615,15 @@ msgstr "Prędkość wentylatora dla środkowej warstwy tratwy." msgctxt "raft_interface_fan_speed label" msgid "Raft Middle Fan Speed" -msgstr "Średnia szybkość wentylatora tratwy" +msgstr "Prędk. Went. Środek Tratwy" msgctxt "raft_interface_jerk description" msgid "The jerk with which the middle raft layer is printed." -msgstr "Funkcja (jerk) z których środkowe warstwy tratwy są drukowane." +msgstr "Zryw, z którym drukowany jest środek tratwy." msgctxt "raft_interface_jerk label" msgid "Raft Middle Print Jerk" -msgstr "Funkcja Print Center Tratwa Jerk" +msgstr "Zryw Środek Tratwy" msgctxt "raft_interface_line_spacing description" msgid "" @@ -2657,25 +2631,25 @@ msgid "" "of the middle should be quite wide, while being dense enough to support the " "top raft layers." msgstr "" -"Odległość między linami tratującymi dla środkowej warstwy tratwy. Odległość " -"środkowa powinna być dość szeroka, a jednocześnie wystarczająco gęsta, aby " +"Odległość między liniami na środkowej warstwie tratwy. Odległość środkowa " +"powinna być dość szeroka, a jednocześnie wystarczająco gęsta, aby " "podtrzymywać górne warstwy tratwy." msgctxt "raft_interface_line_spacing label" msgid "Raft Middle Spacing" -msgstr "Odległość między środkiem a tratwą" +msgstr "Przerwy Środka Tratwy" msgctxt "raft_interface_line_width description" msgid "" "Width of the lines in the middle raft layer. Making the second layer extrude " "more causes the lines to stick to the build plate." msgstr "" -"Szerokość linii w środkowej warstwie tratwy. Wytłaczanie drugiej warstwy " -"powoduje, że linie przyklejają się do płyty." +"Szerokość linii na środkowej warstwie tratwy. Wytłaczanie drugiej warstwy " +"powoduje, że linie przyklejają się do stołu." msgctxt "raft_interface_line_width label" msgid "Raft Middle Line Width" -msgstr "Szerokość tratwy środkowej" +msgstr "Szerokość Linii Środka Tratwy" msgctxt "raft_interface_speed description" msgid "" @@ -2683,29 +2657,29 @@ msgid "" "quite slowly, as the volume of material coming out of the nozzle is quite " "high." msgstr "" -"Prędkość, z jaką drukuje się środkową warstwę tratwy. Powinno być drukowane " -"dość wolno, ponieważ objętość materiału wydobywającego się z dyszy jest dość " -"duża." +"Prędkość, z jaką drukowana jest środkowa warstwa tratwy. Powinno być " +"drukowane dość wolno, ponieważ objętość materiału wydobywającego się z dyszy " +"jest dość duża." msgctxt "raft_interface_speed label" msgid "Raft Middle Print Speed" -msgstr "Prędkość druku centrum Tratwa" +msgstr "Prędk. Druku Środka Tratwy" msgctxt "raft_interface_thickness description" msgid "Layer thickness of the middle raft layer." -msgstr "Grubość warstwy środkowej warstwy tratwy." +msgstr "Grubość środkowej warstwy tratwy." msgctxt "raft_interface_thickness label" msgid "Raft Middle Thickness" -msgstr "Średnia grubość tratwy" +msgstr "Grubość Środka Tratwy" msgctxt "raft_jerk description" msgid "The jerk with which the raft is printed." -msgstr "Funkcja jerk, z którym tratwa zostanie wydrukowany." +msgstr "Zryw, z jakim drukowana jest tratwa" msgctxt "raft_jerk label" msgid "Raft Print Jerk" -msgstr "Funkcja szarpnięcie (jerk) Tratwa Drukuj" +msgstr "Zryw Tratwy" msgctxt "raft_margin description" msgid "" @@ -2714,44 +2688,45 @@ msgid "" "while using more material and leaving less area for your print." msgstr "" "Jeśli tratwa jest włączona, jest to dodatkowy obszar tratwy wokół modelu, " -"który ma również tratwę. Zwiększenie marginesu zwiększy tratwę podczas " -"korzystania z większej ilości materiału i pozostawia mniej miejsca na wydruk." +"który ma również tratwę. Zwiększenie marginesu wzmocni tratwę przy " +"wykorzystaniu z większej ilości materiału i pozostawi mniej miejsca na " +"wydruk." msgctxt "raft_margin label" msgid "Raft Extra Margin" -msgstr "Dodatkowa odległość do Tratwy" +msgstr "Dod. Margines Tratwy" msgctxt "raft_speed description" msgid "The speed at which the raft is printed." -msgstr "Prędkość, w jakiej tratwa jest drukowana." +msgstr "Prędkość, z jaką drukowana jest tratwa." msgctxt "raft_speed label" msgid "Raft Print Speed" -msgstr "Prędkość druku tratwy" +msgstr "Prędk. Druku Tratwy" msgctxt "raft_surface_acceleration description" msgid "The acceleration with which the top raft layers are printed." -msgstr "Przyspieszenie, z jaką drukowane są górne warstwy tratwy." +msgstr "Przyspieszenie, z jakim drukowane są górne warstwy tratwy." msgctxt "raft_surface_acceleration label" msgid "Raft Top Print Acceleration" -msgstr "Przyspieszenie druku górnej wartwy tratwy" +msgstr "Przysp. Druku Góry Tratwy" msgctxt "raft_surface_fan_speed description" msgid "The fan speed for the top raft layers." -msgstr "Prędkość wentylatora dla górnej warstwy tratwy." +msgstr "Prędkość wentylatora dla górnych warstw tratwy." msgctxt "raft_surface_fan_speed label" msgid "Raft Top Fan Speed" -msgstr "Szybkość wentylatora górnej warstwy tratwy" +msgstr "Prędk. Went. Góra Tratwy" msgctxt "raft_surface_jerk description" msgid "The jerk with which the top raft layers are printed." -msgstr "Przyśpieszenie (jerk), z którym są drukowane górne warstwy tratwy." +msgstr "Zryw, z jakim drukowane są górne warstwy tratwy." msgctxt "raft_surface_jerk label" msgid "Raft Top Print Jerk" -msgstr "Góra tratwy przyśpieszenie (jerk)" +msgstr "Zryw Góry Tratwy" msgctxt "raft_surface_layers description" msgid "" @@ -2765,31 +2740,31 @@ msgstr "" msgctxt "raft_surface_layers label" msgid "Raft Top Layers" -msgstr "Warstwy górnej tratwy" +msgstr "Górne Warstwy Tartwy" msgctxt "raft_surface_line_spacing description" msgid "" "The distance between the raft lines for the top raft layers. The spacing " "should be equal to the line width, so that the surface is solid." msgstr "" -"Odległość między tratwami dla górnej warstwy tratwy. Rozstaw powinien być " -"równy szerokości linii, tak że powierzchnia jest stała." +"Odległość między liniami na górnej warstwie tratwy. Rozstaw powinien być " +"równy szerokości linii, tak że powierzchnia jest pełna." msgctxt "raft_surface_line_spacing label" msgid "Raft Top Spacing" -msgstr "Rozstaw górny tratw" +msgstr "Przerwy Góra Tratwy" msgctxt "raft_surface_line_width description" msgid "" "Width of the lines in the top surface of the raft. These can be thin lines " "so that the top of the raft becomes smooth." msgstr "" -"Szerokość linii w górnej powierzchni tratwy. Mogą to być cienkie linie tak, " +"Szerokość linii na górnej powierzchni tratwy. Mogą to być cienkie linie tak, " "aby góra tratwy była gładka." msgctxt "raft_surface_line_width label" msgid "Raft Top Line Width" -msgstr "Szerokość linii górnej tratwy" +msgstr "Szerokość Linii Góra Tratwy" msgctxt "raft_surface_speed description" msgid "" @@ -2797,21 +2772,21 @@ msgid "" "a bit slower, so that the nozzle can slowly smooth out adjacent surface " "lines." msgstr "" -"Prędkość, w jakiej są drukowane górne warstwy tratwy. Powinny być drukowane " +"Prędkość, w jaką są drukowane górne warstwy tratwy. Powinny być drukowane " "nieco wolniej, dzięki czemu dysza może powoli wypolerować sąsiednie linie " "powierzchni." msgctxt "raft_surface_speed label" msgid "Raft Top Print Speed" -msgstr "Górna szybkość druku tratwy" +msgstr "Prędk. Druku Góry Tratwy" msgctxt "raft_surface_thickness description" msgid "Layer thickness of the top raft layers." -msgstr "Grubość warstwy górnej warstwy tratwy." +msgstr "Grubość warstwy górnych warstw tratwy." msgctxt "raft_surface_thickness label" msgid "Raft Top Layer Thickness" -msgstr "Grubość warstwy tratwy" +msgstr "Grubość Warstwy Góra Tratwy" msgctxt "resolution description" msgid "" @@ -2819,7 +2794,7 @@ msgid "" "a large impact on the quality (and print time)" msgstr "" "Wszystkie ustawienia, które wpływają na rozdzielczość druku. Ustawienia te " -"mają ogromny wpływ na jakość kompresji (zmęczenie)." +"mają ogromny wpływ na jakość (i czas druku)" msgctxt "resolution label" msgid "Quality" @@ -2831,15 +2806,15 @@ msgstr "Cofnij filament, gdy dysza przesuwa się do następnej warstwy." msgctxt "retract_at_layer_change label" msgid "Retract at Layer Change" -msgstr "Poruszać się ze zmianą warstwy" +msgstr "Retrakcja podczas Zmiany Warstwy" msgctxt "retraction_amount description" msgid "The length of material retracted during a retraction move." -msgstr "Długość materiału wycofanego podczas przesuwania." +msgstr "Długość materiału wycofanego podczas retrakcji." msgctxt "retraction_amount label" msgid "Retraction Distance" -msgstr "Długość cofania filamentu" +msgstr "Długość Retrakcji" msgctxt "retraction_combing description" msgid "" @@ -2849,27 +2824,28 @@ msgid "" "moves in a straight line to the next point. It is also possible to avoid " "combing over top/bottom skin areas by combing within the infill only." msgstr "" -"Kombinacja utrzymuje dyszę w już zadrukowanych obszarach podczas podróży. " -"Powoduje to nieco dłuższe ruchy podróży, ale zmniejsza potrzebę wycofania. " -"Jeśli czesanie jest wyłączone, materiał się cofa, a dysza przemieszcza się w " -"prostej linii do następnego punktu. Można też unikać czesania górnych / " -"dolnych obszarów skóry przez czesanie wewnątrz wypełnienia." +"Kombinowanie utrzymuje dyszę w już zadrukowanych obszarach podczas ruchu " +"jałowego. Powoduje to nieco dłuższe ruchy jałowe, ale zmniejsza potrzebę " +"retrakcji Jeśli kombinowanie jest wyłączone, materiał się cofa, a dysza " +"przemieszcza się w linii prostej do następnego punktu. Można też unikać " +"kombinowania na górnych/dolnych obszarach skóry przez kombinowanie tylko " +"wewnątrz wypełnienia." msgctxt "retraction_combing label" msgid "Combing Mode" -msgstr "Tryb łączenia" +msgstr "Tryb Kombinowania" msgctxt "retraction_combing option all" msgid "All" -msgstr "Wszystko" +msgstr "Wszędzie" msgctxt "retraction_combing option noskin" msgid "No Skin" -msgstr "Bez poszycia zewnętrznego" +msgstr "Bez skóry" msgctxt "retraction_combing option off" msgid "Off" -msgstr "Poza" +msgstr "Wyłącz" msgctxt "retraction_count_max description" msgid "" @@ -2878,37 +2854,38 @@ msgid "" "ignored. This avoids retracting repeatedly on the same piece of filament, as " "that can flatten the filament and cause grinding issues." msgstr "" -"To ustawienie ogranicza liczbę wycofań występujących w minimalnym oknie " -"odległości wyciskania. Dalsze wycofania w tym oknie zostaną zignorowane. " -"Pozwala to uniknąć wielokrotnego opuszczania na tym samym kawałku żarnika, " -"ponieważ może spłaszczyć włókno i powodować problemy z wyciskaniem filamentu." +"To ustawienie ogranicza liczbę retrakcji występujących w oknie minimalnej " +"długości ekstruzji. Dalsze retrakcje w tym oknie zostaną zignorowane. " +"Pozwala to uniknąć wielokrotnych retrakcji na tym samym odcinku filamentu, " +"ponieważ może to spłaszczyć filament i spowodować problemy z wyciskaniem " +"filamentu." msgctxt "retraction_count_max label" msgid "Maximum Retraction Count" -msgstr "Maksymalna liczba wycofania" +msgstr "Maksymalna Liczba Retrakcji" msgctxt "retraction_enable description" msgid "" "Retract the filament when the nozzle is moving over a non-printed area. " msgstr "" -"Cofnij włókno, gdy dysza porusza się nad obszarem, w którym nie jest " -"zadrukowany." +"Cofnij filament, gdy dysza porusza się nad obszarem, w którym nie ma " +"drukować. " msgctxt "retraction_enable label" msgid "Enable Retraction" -msgstr "Włącz wycofanie" +msgstr "Włącz Retrakcję" msgctxt "retraction_extra_prime_amount description" msgid "" "Some material can ooze away during a travel move, which can be compensated " "for here." msgstr "" -"Podczas przemieszczania przez nie obszaru drukowania materiałów mogą " -"wypływać z dala, które mogą być kompensowane tutaj." +"Trochę materiału może wypływać podczas ruchu jałowego co może zostać " +"skompensowane tutaj." msgctxt "retraction_extra_prime_amount label" msgid "Retraction Extra Prime Amount" -msgstr "Dodatkowa retrakcja Push-back " +msgstr "Dod. Czyszcz. Wart. Retrakcji" msgctxt "retraction_extrusion_window description" msgid "" @@ -2917,22 +2894,22 @@ msgid "" "effectively the number of times a retraction passes the same patch of " "material is limited." msgstr "" -"Okno, w którym maksymalna liczba wycofania jest wymuszona. Wartość ta " -"powinna być w przybliżeniu taka sama jak odległość wycofania, dzięki czemu " -"skutecznie liczba razy cofnięcie przebiega przez tę samą warstwę materiału " -"jest ograniczona." +"Okno, w którym wymuszona jest maksymalna liczba retrakcji. Wartość ta " +"powinna być w przybliżeniu taka sama jak odległość retrakcji, dzięki czemu " +"skuteczna liczba retrakcji używająca tej samej cząstki materiału jest " +"limitowana." msgctxt "retraction_extrusion_window label" msgid "Minimum Extrusion Distance Window" -msgstr "Minimalna odległość Okno wytłaczania" +msgstr "Okno Min. Dług. Ekstruzji" msgctxt "retraction_hop description" msgid "The height difference when performing a Z Hop." -msgstr "Różnica w wysokości podczas wykonywania Z-skok." +msgstr "Różnica w wysokości podczas przeprowadzania Skoku Z." msgctxt "retraction_hop label" msgid "Z Hop Height" -msgstr "Wysokość skoku Z" +msgstr "Wysokość Skoku Z" msgctxt "retraction_hop_after_extruder_switch description" msgid "" @@ -2940,13 +2917,13 @@ msgid "" "is lowered to create clearance between the nozzle and the print. This " "prevents the nozzle from leaving oozed material on the outside of a print." msgstr "" -"Po przełączeniu maszyny z jednej wytłaczarki na drugą, płyta konstrukcyjna " -"jest opuszczana, aby utworzyć luz pomiędzy dyszy a drukiem. Zapobiega to " -"wypływaniu dyszy z wypchanego materiału na zewnątrz wydruku." +"Po przełączeniu maszyny z jednego ekstrudera na drugi, stół jest opuszczany, " +"aby utworzyć luz pomiędzy dyszą a drukiem. Zapobiega to pozostawianiu " +"wypływającego materiału na powierzchni wydruku." msgctxt "retraction_hop_after_extruder_switch label" msgid "Z Hop After Extruder Switch" -msgstr "Przełącznik wytłaczarki Z skok" +msgstr "Skok Z po Zmianie Ekstrudera" msgctxt "retraction_hop_enabled description" msgid "" @@ -2955,74 +2932,71 @@ msgid "" "hitting the print during travel moves, reducing the chance to knock the " "print from the build plate." msgstr "" -"Zawsze, gdy następuje wycofanie, płyta konstrukcyjna jest opuszczana w celu " -"utworzenia luzu między dyszą a drukiem. Zapobiega to uderzeniu dyszy w ruch " -"podczas podróży, co zmniejsza szanse wybicia wydruku z płyty." +"Zawsze, gdy następuje retrakcja, stół roboczy jest opuszczany w celu " +"utworzenia luzu między dyszą a drukiem. Zapobiega to uderzeniu dyszy podczas " +"ruchu jałowego, co zmniejsza szanse uderzenia wydruku na stole." msgctxt "retraction_hop_enabled label" msgid "Z Hop When Retracted" -msgstr "Z-skok podczas wciągania" +msgstr "Skok Z Podczas Retrakcji" msgctxt "retraction_hop_only_when_collides description" msgid "" "Only perform a Z Hop when moving over printed parts which cannot be avoided " "by horizontal motion by Avoid Printed Parts when Traveling." msgstr "" -"Podczas przesuwania się nad drukowanymi częściami, które nie da się uniknąć " -"w ruchu poziomej, wykonaj Z-skok tylko unikając drukowanych części podczas " -"podróży." +"Wykonuj Skok Z tylko podczas ruchu nad wydrukowanymi częściami, które nie " +"mogą być ominięte za pomocą Omijaj Częścipodczas Ruchu Jałowego." msgctxt "retraction_hop_only_when_collides label" msgid "Z Hop Only Over Printed Parts" -msgstr "Z-skok tylko nad drukowanymi częściami" +msgstr "Skok Z Tylko nad Druk. Częściami" msgctxt "retraction_min_travel description" msgid "" "The minimum distance of travel needed for a retraction to happen at all. " "This helps to get fewer retractions in a small area." msgstr "" -"Minimalna odległość podróży potrzebna do wycofania się w ogóle. To pomaga " -"uzyskać mniej retractions w małym obszarze." +"Minimalna odległość ruchu jałowego potrzebna do wykonania retrkacji. Pomaga " +"to uzyskać mniej retrakcji w małym obszarze." msgctxt "retraction_min_travel label" msgid "Retraction Minimum Travel" -msgstr "Minimalny przejazd dla retrakcji" +msgstr "Minimalny Przejazd dla Retrakcji" msgctxt "retraction_prime_speed description" msgid "The speed at which the filament is primed during a retraction move." -msgstr "Prędkość, przy której dysza jest przesunięta w czasie ruchu cofania." +msgstr "Prędkość, z jaką retrakcja jest dopełniana." msgctxt "retraction_prime_speed label" msgid "Retraction Prime Speed" -msgstr "Wysoka prędkość wycofania retrakcji" +msgstr "Prędk. Dopełn. Retrakcji" msgctxt "retraction_retract_speed description" msgid "The speed at which the filament is retracted during a retraction move." -msgstr "Prędkość, z jaką włókna są wycofywane podczas ruchu wycofania." +msgstr "Prędkość, z jaką wykonywana jest retrakcja." msgctxt "retraction_retract_speed label" msgid "Retraction Retract Speed" -msgstr "Prędkość wycofania retrakcji" +msgstr "Prędk. Wycofania Retrakcji" msgctxt "retraction_speed description" msgid "" "The speed at which the filament is retracted and primed during a retraction " "move." -msgstr "" -"Prędkość, z jaką włókna są wycofywane i zagruntowane podczas ruchu " -"wycofywania." +msgstr "Prędkość, z jaką jest wykonywana i dopełniana retrakcja." msgctxt "retraction_speed label" msgid "Retraction Speed" -msgstr "Prędkość wycofania" +msgstr "Prędkość Retrakcji" msgctxt "shell description" msgid "Shell" -msgstr "Szkielet" +msgstr "Powłoka" msgctxt "shell label" msgid "Shell" -msgstr "Szkielet" +msgstr "Powłoka" msgctxt "skin_alternate_rotation description" msgid "" @@ -3030,13 +3004,12 @@ msgid "" "they are printed diagonally only. This setting adds the X-only and Y-only " "directions." msgstr "" -"Kierunek, w którym górne / dolne warstwy są drukowane są zmieniane. " -"Zazwyczaj są one drukowane na ukos. Ustawienie to zwiększa tylko X i Y tylko " -"kierunku." +"Zmień kierunek, w jakim drukowane są górne/dolne warstwy. Zazwyczaj są one " +"drukowane na ukos. Ustawienie to dodaje kierunek \"tylko X\" i \"tylko Y\"." msgctxt "skin_alternate_rotation label" msgid "Alternate Skin Rotation" -msgstr "Zmiana obrotów zewnętrznego pokrycia" +msgstr "Zmień Kierunek Skóry" msgctxt "skin_angles description" msgid "" @@ -3047,24 +3020,24 @@ msgid "" "list is contained in square brackets. Default is an empty list which means " "use the traditional default angles (45 and 135 degrees)." msgstr "" -"Lista kierunków linii całkowitych używanych, gdy warstwy górne / dolne " -"używają linii lub wzoru zygzakowego. Elementy z listy są używane kolejno w " -"miarę postępu warstw, a kiedy kończy się lista, zaczyna się od początku. " -"Elementy listy są oddzielone przecinkami, a cała lista znajduje się w " -"nawiasach kwadratowych. Domyślnie jest pusta lista, która oznacza tradycyjne " -"domyślne kąty (45 i 135 stopni)." +"Lista całkowitych kierunków linii używana kiedy górne/dolne warstwy używają " +"wzoru linii i zygzaka. Elementy z listy są używane kolejno w miarę postępu " +"warstw, a kiedy kończy się lista, zaczyna się od początku. Elementy listy są " +"oddzielone przecinkami, a cała lista znajduje się w nawiasach kwadratowych. " +"Domyślnie lista jest pusta, co oznacza tradycyjne, domyślne kąty (45 i 135 " +"stopni)." msgctxt "skin_angles label" msgid "Top/Bottom Line Directions" -msgstr "Kierunki górnej / dolnej linii" +msgstr "Kierunki Linii Góra/Dół" msgctxt "skin_line_width description" msgid "Width of a single top/bottom line." -msgstr "Szerokość pojedynczej górnej / dolnej linii." +msgstr "Szerokość pojedynczej górnej/dolnej linii." msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" -msgstr "Szerokość górnej / dolnej linii" +msgstr "Szerokość Górnej/Dolnej Linii" msgctxt "skin_no_small_gaps_heuristic description" msgid "" @@ -3072,13 +3045,13 @@ msgid "" "be spent on generating top and bottom skin in these narrow spaces. In such " "case, disable the setting." msgstr "" -"Jeśli model ma małe, pionowe szczeliny, to w tych wąskich przestrzeniach " -"można wydać około 5% dodatkowego czasu obliczeniowego. W takim przypadku " -"wyłączyć ustawienie." +"Jeśli model ma małe, pionowe szczeliny, to można wykorzystać dodatkowe 5% " +"mocy obliczeniowej do wygenerowania górnej i dolnej skóry w wąskich " +"przestrzeniach. W takim wypadku, wyłącz tę opcję." msgctxt "skin_no_small_gaps_heuristic label" msgid "Ignore Small Z Gaps" -msgstr "Zignoruj małe luki Z" +msgstr "Zignoruj Małe Luki Z" msgctxt "skin_outline_count description" msgid "" @@ -3086,45 +3059,45 @@ msgid "" "concentric lines. Using one or two lines improves roofs that start on infill " "material." msgstr "" -"Zastępuje najbardziej zewnętrzną część wzoru górnego / dolnego za pomocą " -"kilku koncentrycznych linii. Korzystanie z jednej lub dwóch linii poprawia " -"dachy, które zaczynają się od materiału wypełniającego." +"Zastępuje najbardziej zewnętrzną część wzoru górnego/dolnego za pomocą kilku " +"koncentrycznych linii. Korzystanie z jednej lub dwóch linii poprawia dachy, " +"które zaczynają się na wypełnieniu." msgctxt "skin_outline_count label" msgid "Extra Skin Wall Count" -msgstr "Numer linii dodatkowej zewnętrznej skóry" +msgstr "Liczba Dod. Ścian na Skórze" msgctxt "skin_overlap description" msgid "" "The amount of overlap between the skin and the walls. A slight overlap " "allows the walls to connect firmly to the skin." msgstr "" -"Ilość nakładania się powłoki zewnętrznej i ścian. Lekkie nałożenie pozwala " -"ściśle łączyć się z powłoką zewnętrzną" +"Ilość nakładania się skóry i ścian. Lekkie nałożenie pozwala ściśle łączyć " +"się ze skórą." msgctxt "skin_overlap label" msgid "Skin Overlap Percentage" -msgstr "Zakładka nakładania powłoki zewnętrznej" +msgstr "Procent Nakładania się Skóry" msgctxt "skin_overlap_mm description" msgid "" "The amount of overlap between the skin and the walls. A slight overlap " "allows the walls to connect firmly to the skin." msgstr "" -"Ilość nakładania powłoki i ścian. Lekkie nałożenie pozwala ściśle łączyć się " -"ze powłoką." +"Ilość nakładania się skóry i ścian. Lekkie nałożenie pozwala ściśle łączyć " +"się ze skórą." msgctxt "skin_overlap_mm label" msgid "Skin Overlap" -msgstr "Nasunięcie się warstw na siebie powłoki zewnętrznej" +msgstr "Nakładanie się Skóry" msgctxt "skirt_brim_line_width description" msgid "Width of a single skirt or brim line." -msgstr "Szerokość pojedynczej linii Skirt lub Brim" +msgstr "Szerokość pojedynczej linii Obwódki i Obrysu." msgctxt "skirt_brim_line_width label" msgid "Skirt/Brim Line Width" -msgstr "Skirt- (spódnica) / Brim- (rondo) Szerokość linii" +msgstr "Szer. Linii Obwódki/Obrysu" msgctxt "skirt_brim_minimal_length description" msgid "" @@ -3133,14 +3106,14 @@ msgid "" "until the minimum length is reached. Note: If the line count is set to 0 " "this is ignored." msgstr "" -"Minimalna długość obwódki lub obrzeża. Jeśli ta długość nie zostanie " -"osiągnięta przez całą linie obwodową lub obwódkę, należy dodać więcej linii " -"brzegowych, aż do osiągnięcia minimalnej długości. Uwaga: Jeśli liczba " -"wierszy jest ustawiona na 0, to jest ignorowana." +"Minimalna długość obwódki lub obrysu. Jeśli ta długość nie zostanie " +"osiągnięta przez całą linie obwódki lub obrysu, należy dodać więcej linii, " +"aż do osiągnięcia minimalnej długości. Uwaga: Jeśli liczba linii jest " +"ustawiona na 0, to opcja jest ignorowana." msgctxt "skirt_brim_minimal_length label" msgid "Skirt/Brim Minimum Length" -msgstr "Minimalna długość Obwódki/Obrzeża Skirt/Brim" +msgstr "Min. Dł. Obwódki/Obrysu" msgctxt "skirt_brim_speed description" msgid "" @@ -3148,13 +3121,13 @@ msgid "" "the initial layer speed, but sometimes you might want to print the skirt or " "brim at a different speed." msgstr "" -"Prędkość, z jaką jest drukowana spódnica i brzeg-obręcz (Skirt/Brim). Zwykle " -"jest to wykonywane przy początkowej szybkości warstwy, ale czasami można " -"wydrukować spódnicę lub obręcz przy innej prędkości." +"Prędkość, z jaką jest drukowana obwódka i obrys. Zwykle jest to wykonywane " +"przy szybkości początkowej warstwy, ale czasami możesz chcieć drukować " +"obwódkę lub obrys z inną prędkością." msgctxt "skirt_brim_speed label" msgid "Skirt/Brim Speed" -msgstr "Prędkość Skirt/Brim" +msgstr "Prędkość Obwódka/Obrys" msgctxt "skirt_gap description" msgid "" @@ -3162,25 +3135,25 @@ msgid "" "This is the minimum distance, multiple skirt lines will extend outwards from " "this distance." msgstr "" -"Pozioma odległość między linią wokół modelu a pierwszą warstwą nadruku.\n" -"Jest to o minimalnej odległości. Z tej odległości linie montowane są w " -"zewnętrznym kierunku." +"Pozioma odległość między obwódką a pierwszą warstwą nadruku.\n" +"Jest to o minimalnej odległości. Z tej odległości linie będą nakładane w " +"kierunku zewnętrznym." msgctxt "skirt_gap label" msgid "Skirt Distance" -msgstr "Odległość obwódki od modelu" +msgstr "Odległ. Obwódki" msgctxt "skirt_line_count description" msgid "" "Multiple skirt lines help to prime your extrusion better for small models. " "Setting this to 0 will disable the skirt." msgstr "" -"Liczne linie wokół pomagają w lepszym wytłaczaniu małych modeli. Ustawienie " -"na 0 spowoduje wyłączenie obwódki." +"Liczne linie pomagają w lepszym wytłaczaniu małych modeli. Ustawienie na 0 " +"spowoduje wyłączenie obwódki." msgctxt "skirt_line_count label" msgid "Skirt Line Count" -msgstr "Obwódka liczba linii" +msgstr "Liczba Linii Obwódki" msgctxt "smooth_spiralized_contours description" msgid "" @@ -3188,14 +3161,14 @@ msgid "" "seam should be barely visible on the print but will still be visible in the " "layer view). Note that smoothing will tend to blur fine surface details." msgstr "" -"Wygładź kontur spirali, aby zmniejszyć widoczność szwu Z (szkielet Z " -"powinien być ledwo widoczny na wydruku, ale nadal będzie widoczny w widoku " -"warstwy). Należy pamiętać, że wygładzanie będzie miało tendencję do rozmycia " -"drobnych szczegółów powierzchni." +"Wygładź spiralny kontur, aby zmniejszyć widoczność szwu Z (szew Z powinien " +"być ledwo widoczny na wydruku, ale nadal będzie widoczny w widoku warstwy). " +"Należy pamiętać, że wygładzanie będzie miało tendencję do rozmycia drobnych " +"szczegółów powierzchni." msgctxt "smooth_spiralized_contours label" msgid "Smooth Spiralized Contours" -msgstr "Gładkie Spiralne kontury" +msgstr "Wygładź Spiralne Kontury" msgctxt "spaghetti_flow description" msgid "" @@ -3204,12 +3177,12 @@ msgid "" "extrusion for spaghetti infill." msgstr "" "Dostosowuje gęstość wypełnienia spaghetti. Należy zauważyć, że Gęstość " -"wypełnienia tylko kontroluje rozstaw linii wzoru napełniania, a nie ilość " +"Wypełnienia kontroluje tylko rozstaw linii wzoru napełniania, a nie ilość " "wytłaczania wypełnienia spaghetti." msgctxt "spaghetti_flow label" msgid "Spaghetti Flow" -msgstr "Spaghetti-przepływ" +msgstr "Przepływ Spaghetti" msgctxt "spaghetti_infill_enabled description" msgid "" @@ -3217,23 +3190,22 @@ msgid "" "chaotically inside the object. This reduces print time, but the behaviour is " "rather unpredictable." msgstr "" -"Drukowanie wypełnienia tak często, aby włókno zwisało chaotycznie wewnątrz " +"Drukowanie wypełnienia tak często, aby filament zwisał chaotycznie wewnątrz " "przedmiotu. Zmniejsza to czas drukowania, ale zachowanie jest raczej " "nieprzewidywalne." msgctxt "spaghetti_infill_enabled label" msgid "Spaghetti Infill" -msgstr "Spaghetti wypełnienia" +msgstr "Wypełnienie Spaghetti" msgctxt "spaghetti_inset description" msgid "" "The offset from the walls from where the spaghetti infill will be printed." -msgstr "" -"Odsunięcie od ścian, od których będzie drukowane wypełnienie spaghetti." +msgstr "Odsunięcie od ścian, z których będzie drukowane wypełnienie spaghetti." msgctxt "spaghetti_inset label" msgid "Spaghetti Inset" -msgstr "Spaghetti-wkład" +msgstr "Wkład Spaghetti" msgctxt "spaghetti_max_height description" msgid "" @@ -3241,11 +3213,11 @@ msgid "" "top." msgstr "" "Maksymalna wysokość przestrzeni wewnętrznej, którą można łączyć i napełniać " -"z góry." +"od góry." msgctxt "spaghetti_max_height label" msgid "Spaghetti Infill Maximum Height" -msgstr "Spaghetti wypełnia maksymalną wysokość" +msgstr "Maks. Wys. Wypełn. Spaghetti" msgctxt "spaghetti_max_infill_angle description" msgid "" @@ -3253,13 +3225,14 @@ msgid "" "which are to be filled with spaghetti infill afterwards. Lowering this value " "causes more angled parts in your model to be filled on each layer." msgstr "" -"Maksymalny kąt w.r.t. Oś Z wewnątrz wydruku dla obszarów, które mają być " -"wypełnione wypełnieniem spaghetti. Obniżenie tej wartości powoduje, że na " -"każdym wariancie zostaną wypełnione więcej części pod kątem w modelu." +"Maksymalny kąt w odniesieniu do Osi Z wewnątrz wydruku dla obszarów, które " +"mają być wypełnione wypełnieniem spaghetti. Obniżenie tej wartości powoduje, " +"że więcej części modelu, które są pod kątem, będzie wypełnianych na każdej " +"warstwie." msgctxt "spaghetti_max_infill_angle label" msgid "Spaghetti Maximum Infill Angle" -msgstr "Spaghetti maksymalny kąt wypełnienia" +msgstr "Maks. Kąt Wypełn. Spaghetti" msgctxt "speed description" msgid "Speed" @@ -3283,26 +3256,26 @@ msgstr "" msgctxt "speed_equalize_flow_enabled label" msgid "Equalize Filament Flow" -msgstr "Równowaga przepływu dyszy" +msgstr "Zrówn. Przepływ Filamentu" msgctxt "speed_equalize_flow_max description" msgid "" "Maximum print speed when adjusting the print speed in order to equalize flow." msgstr "" "Maksymalna prędkość drukowania podczas ustawiania prędkości druku w celu " -"wyrównywania przepływu." +"zrównoważenia przepływu." msgctxt "speed_equalize_flow_max label" msgid "Maximum Speed for Flow Equalization" -msgstr "Maksymalna prędkość dla wyrównania przepływu" +msgstr "Maks. Prędk. dla Zrówn. Przepływu" msgctxt "speed_infill description" msgid "The speed at which infill is printed." -msgstr "Szybkość, przy której wypełnienie jest drukowane." +msgstr "Prędkość, z jaką drukowane jest wypełnienie." msgctxt "speed_infill label" msgid "Infill Speed" -msgstr "Prędkość wypełnienia" +msgstr "Prędkość Wypełn." msgctxt "speed_layer_0 description" msgid "" @@ -3310,11 +3283,11 @@ msgid "" "adhesion to the build plate." msgstr "" "Prędkość dla pierwszej warstwy. Niższa wartość jest zalecane w celu poprawy " -"przyczepności do płyty drukarskiej." +"przyczepności do stołu." msgctxt "speed_layer_0 label" msgid "Initial Layer Speed" -msgstr "Szybkość pierwszej warstwy" +msgstr "Prędk. Początk. Warstwy" msgctxt "speed_prime_tower description" msgid "" @@ -3322,13 +3295,13 @@ msgid "" "slower can make it more stable when the adhesion between the different " "filaments is suboptimal." msgstr "" -"Prędkość, z jaką drukowana jest pierwszorzędna wieża. Drukowanie głowicy " -"głównej wolniej może sprawić, że będzie ona bardziej stabilna, gdy adhezja " -"między różnymi włóknami jest nieopłacalna." +"Prędkość, z jaką drukowana jest wieża czyszcząca. Drukowanie wieży " +"czyszczącej wolniej może sprawić, że będzie ona bardziej stabilna, gdy " +"adhezja między różnymi filamentami jest nieoptymalna." msgctxt "speed_prime_tower label" msgid "Prime Tower Speed" -msgstr "Prędkość, z jaką drukowana jest pierwszorzędna wieża." +msgstr "Prędkość Wieży Czyszcz." msgctxt "speed_print description" msgid "The speed at which printing happens." @@ -3336,7 +3309,7 @@ msgstr "Prędkość druku." msgctxt "speed_print label" msgid "Print Speed" -msgstr "Prędkość drukowania" +msgstr "Prędkość Druku" msgctxt "speed_print_layer_0 description" msgid "" @@ -3344,11 +3317,11 @@ msgid "" "improve adhesion to the build plate." msgstr "" "Szybkość drukowania dla pierwszej warstwy. Niższa wartość jest zalecane w " -"celu poprawy przyczepności do płyty drukarskiej." +"celu poprawy przyczepności do stołu." msgctxt "speed_print_layer_0 label" msgid "Initial Layer Print Speed" -msgstr "Szybkość drukowania do pierwszej warstwy" +msgstr "Prędk. Druku Początk. Warstwy" msgctxt "speed_slowdown_layers description" msgid "" @@ -3357,12 +3330,12 @@ msgid "" "prints. The speed is gradually increased over these layers." msgstr "" "Pierwsze warstwy są drukowane wolniej niż w pozostałej części modelu, więc " -"lepiej przylegają do łóżka druku i zwiększyć prawdopodobieństwo pomyślnego " -"ciśnieniem. Prędkość wzrasta stopniowo w czasie produkcji tych warstw." +"lepiej przylegają do stołu i zwiększa się prawdopodobieństwo sukcesu. " +"Prędkość wzrasta stopniowo w czasie druku tych warstw." msgctxt "speed_slowdown_layers label" msgid "Number of Slower Layers" -msgstr "Ilość wolnych warstw" +msgstr "Ilość Wolnych Warstw" msgctxt "speed_support description" msgid "" @@ -3370,78 +3343,78 @@ msgid "" "higher speeds can greatly reduce printing time. The surface quality of the " "support structure is not important since it is removed after printing." msgstr "" -"Szybkość, z jaką struktura nośna jest drukowana. Drukując konstrukcję " -"podporową przy wyższych prędkościach, całkowity czas drukowania może być " -"znacznie zmniejszona. Jakość powierzchni konstrukcji nośnej nie ma " -"znaczenia, ponieważ jest on usuwany po drukowaniu." +"Szybkość, z jaką drukowane są podpory. Drukując podpory przy wyższych " +"prędkościach, całkowity czas drukowania może być znacznie zmniejszony. " +"Jakość powierzchni podpory nie ma znaczenia, ponieważ jest ona usuwana po " +"wydrukowaniu." msgctxt "speed_support label" msgid "Support Speed" -msgstr "Prędkość podpór" +msgstr "Prędkość Podpór" msgctxt "speed_support_bottom description" msgid "" "The speed at which the floor of support is printed. Printing it at lower " "speed can improve adhesion of support on top of your model." msgstr "" -"Prędkość, z jaką drukowana jest podpórka. Drukowanie z niższą prędkością " -"może poprawić przyczepność podpory nad modelem." +"Prędkość, z jaką drukowane jest podłoże podpory. Drukowanie z niższą " +"prędkością może poprawić przyczepność podpory na modelu." msgctxt "speed_support_bottom label" msgid "Support Floor Speed" -msgstr "Prędkosć drukowanych podpór dolnych/podłogi" +msgstr "Prędk. Podstawy Podpory" msgctxt "speed_support_infill description" msgid "" "The speed at which the infill of support is printed. Printing the infill at " "lower speeds improves stability." msgstr "" -"Prędkość, z jaką drukowany jest wypełnienie podłoża. Drukowanie wypełnień " +"Prędkość, z jaką drukowane jest wypełnienie podstawy. Drukowanie wypełnień " "przy niższych prędkościach poprawia stabilność." msgctxt "speed_support_infill label" msgid "Support Infill Speed" -msgstr "Prędkość wypełnienia podpór" +msgstr "Prędkość Wypełn. Podpór" msgctxt "speed_support_interface description" msgid "" "The speed at which the roofs and floors of support are printed. Printing " "them at lower speeds can improve overhang quality." msgstr "" -"Szybkość, z jaką dachy i podłogi konstrukcji nośnej mają zostać wydrukowane. " -"Drukując z mniejszą prędkością, jakość nawisy można poprawić." +"Szybkość, z jaką drukowane są dachy i podłoża podpór. Drukując z mniejszą " +"prędkością, można poprawić jakość nawisów." msgctxt "speed_support_interface label" msgid "Support Interface Speed" -msgstr "Prędkość interfejsu wsparcia" +msgstr "Prędk. Połączenia Podpór" msgctxt "speed_support_roof description" msgid "" "The speed at which the roofs of support are printed. Printing them at lower " "speeds can improve overhang quality." msgstr "" -"Prędkość, w jakiej są drukowane nad dachami podparcia. Drukowanie przy " -"niższych prędkościach może poprawić jakość zwisu." +"Prędkość, z jaką drukowane są dachy podpory. Drukowanie przy niższych " +"prędkościach może poprawić jakość nawisów." msgctxt "speed_support_roof label" msgid "Support Roof Speed" -msgstr "Prędkość drukowanych podpór zwisów/dachu" +msgstr "Prędkość Dachu Podpory" msgctxt "speed_topbottom description" msgid "The speed at which top/bottom layers are printed." -msgstr "Szybkość, przy której górne / dolne warstwy druku są drukowane." +msgstr "Szybkość, z jaką drukowane są górne/dolne warstwy." msgctxt "speed_topbottom label" msgid "Top/Bottom Speed" -msgstr "Prędkość górnej / dolnej warstwy" +msgstr "Prędkość Góra/Dół" msgctxt "speed_travel description" msgid "The speed at which travel moves are made." -msgstr "Prędkość, w jakiej wykonywane są przemieszczenia." +msgstr "Prędkość, z jaką wykonywane są ruchy jałowe." msgctxt "speed_travel label" msgid "Travel Speed" -msgstr "Szybkość przemieszczania" +msgstr "Prędkość Ruchów Jałowych" msgctxt "speed_travel_layer_0 description" msgid "" @@ -3450,14 +3423,14 @@ msgid "" "value of this setting can automatically be calculated from the ratio between " "the Travel Speed and the Print Speed." msgstr "" -"Prędkość przesuwa się w początkowej warstwie. Zaleca się niższą wartość, aby " -"zapobiec ciągnięciu wcześniej wydrukowanych części z płyty montażowej. " -"Wartość tego ustawienia może być automatycznie obliczana na podstawie " -"stosunku prędkości podróży i prędkości druku." +"Prędkość ruchów jałowych na pierwszej warstwie. Zaleca się niższą wartość, " +"aby zapobiec ściągnięciu wcześniej wydrukowanych części ze stołu. Wartość " +"tego ustawienia może być automatycznie obliczana na podstawie stosunku " +"Prędkości Ruchów Jałowych i Prędkości Druku." msgctxt "speed_travel_layer_0 label" msgid "Initial Layer Travel Speed" -msgstr "Prędkość ruchu dla pierwszej warstwy" +msgstr "Prędk. Ruchów Jał. na 1. Warstwie" msgctxt "speed_wall description" msgid "The speed at which the walls are printed." @@ -3465,7 +3438,7 @@ msgstr "Prędkość drukowania ścian." msgctxt "speed_wall label" msgid "Wall Speed" -msgstr "Szybkość ściany" +msgstr "Prędkość Ścian" msgctxt "speed_wall_0 description" msgid "" @@ -3474,14 +3447,14 @@ msgid "" "difference between the inner wall speed and the outer wall speed will affect " "quality in a negative way." msgstr "" -"Szybkość, przy której ścianki zewnętrzne są drukowane. Drukując zewnętrzną " -"ściankę w niższej prędkości, lepsza jakośś końcowa powłoki zewnętrznej jest " -"osiągnięta. Jednakże, jeśli nie ma między prędkością ściany wewnętrznej i " -"ściany zewnętrznej, że dla zbyt wielkiej różnicy, jakość jest niekorzystna." +"Szybkość, z jaką drukowane są ściany zewnętrzne. Drukując zewnętrzną ściankę " +"z niższą prędkością, osiągana jest lepsza jakość skóry. Jednakże, posiadanie " +"dużej różnicy pomiędzy prędkością zewnętrznej ściany, a wewnętrznej może " +"skutkować negatywnie." msgctxt "speed_wall_0 label" msgid "Outer Wall Speed" -msgstr "Zewnętrzna ściana prędkość" +msgstr "Prędkość Zewn. Ściany" msgctxt "speed_wall_x description" msgid "" @@ -3489,14 +3462,13 @@ msgid "" "faster than the outer wall will reduce printing time. It works well to set " "this in between the outer wall speed and the infill speed." msgstr "" -"Szybkość, przy której wszystkie ściany wewnętrzne są drukowane. Gdy ścianka " -"wewnętrzna jest większa od zewnętrznej ściany drukowanej czas drukowania " -"zmniejsza się. Zaleca się, aby to prędkości między prędkością ścianki " -"zewnętrznej i prędkości wypełnienia." +"Szybkość, z jaką drukowane są ściany wewnętrzne. Drukowanie wewnętrznej " +"ściany szybciej niż zewn. pozwoli skrócić czas druku. Zaleca się, aby " +"ustawić to pomiędzy prędkością zewn. ściany, a prędkością wypełnienia" msgctxt "speed_wall_x label" msgid "Inner Wall Speed" -msgstr "Prędkość wewnętrznej ściany" +msgstr "Prędkość Wewn. Ściany" msgctxt "start_layers_at_same_position description" msgid "" @@ -3505,14 +3477,14 @@ msgid "" "ended with. This makes for better overhangs and small parts, but increases " "printing time." msgstr "" -"W każdej warstwie zaczynają się drukowanie przedmiotu w tym samym punkcie, " -"abyśmy nie zaczęli nowej warstwy z nadrukiem kawałka, który poprzednia " -"warstwa się skończyła. Powoduje to lepsze zwisanie i małe części, ale " -"zwiększa czas drukowania." +"Na każdej warstwie rozpocznij drukowanie obiektu blisko tego samego punktu, " +"abyśmy nie rozpoczynali nowej warstwy w miejscu gdzie skończyła się " +"poprzednia warstwa. Powoduje to lepsze nawisy i małe elementy, ale wydłuża " +"czas druku." msgctxt "start_layers_at_same_position label" msgid "Start Layers with the Same Part" -msgstr "Uruchamianie warstw o tej samej części" +msgstr "Rozp. Warstwy w tym Samym Punkcie" msgctxt "sub_div_rad_add description" msgid "" @@ -3521,118 +3493,116 @@ msgid "" "Larger values lead to a thicker shell of small cubes near the boundary of " "the model." msgstr "" -"Dodano do promienia od środka każdej kostki, aby sprawdzić granicę modelu, " -"aby podjąć decyzję, czy taka kostka powinna być podzielona. Większe wartości " +"Dodatek do promienia od środka każdej kostki, aby sprawdzić granicę modelu i " +"podjąć decyzję, czy taka kostka powinna być podzielona. Większe wartości " "prowadzą do grubszej powłoki małych kostek w pobliżu granicy modelu." msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" -msgstr "Sześcian" +msgstr "Sześcienny Podział Powłoki" msgctxt "support description" msgid "Support" -msgstr "Konstrukcja nośna/Podpora" +msgstr "Podpory" msgctxt "support label" msgid "Support" -msgstr "Konstrukcja nośna/Podpora" +msgstr "Podpory" msgctxt "support_angle description" msgid "" "The minimum angle of overhangs for which support is added. At a value of 0° " "all overhangs are supported, 90° will not provide any support." msgstr "" -"Minimalny kąt zwisu, dla którego dodano podporę. Przy wartości 0 ° wszystkie " -"wsporniki są podparte, 90 ° nie zapewnia żadnego podparcia." +"Minimalny kąt zwisu, dla którego dodaje się podporę. Przy wartości 0 ° " +"wszystkie zwisy są podparte, 90 ° nie zapewnia żadnego podparcia." msgctxt "support_angle label" msgid "Support Overhang Angle" -msgstr "Kąt dla konstrukcji nośnej zwisy" +msgstr "Kąt Zwisu dla Podpory" msgctxt "support_bottom_density description" msgid "" "The density of the floors of the support structure. A higher value results " "in better adhesion of the support on top of the model." msgstr "" -"Gęstość podłóg konstrukcji nośnej. Wyższa wartość powoduje lepszą adhezję " -"podpory nad modelem." +"Gęstość podłoża podpory. Wyższa wartość powoduje lepszą adhezję podpory na " +"górze modelu." msgctxt "support_bottom_density label" msgid "Support Floor Density" -msgstr "Gęstość podłogi nośnej" +msgstr "Gęstość Podłoża Podpory" msgctxt "support_bottom_distance description" msgid "Distance from the print to the bottom of the support." -msgstr "Odległość od nadruku do dolnej części wspornika." +msgstr "Odległość od wydruku do dolnej części podpory." msgctxt "support_bottom_distance label" msgid "Support Bottom Distance" -msgstr "Dolny rozstaw konstrukcji nośnej" +msgstr "Odległ. na Dole Podpory" msgctxt "support_bottom_enable description" msgid "" "Generate a dense slab of material between the bottom of the support and the " "model. This will create a skin between the model and support." msgstr "" -"Generuje gęstą warstwę materiału pomiędzy spodem konstrukcji nośnej i " -"modelu. To tworzy skórę pomiędzy modelem a konstrukcją nośną." +"Generuj gęstą warstwę materiału pomiędzy spodem podpory a modelem. Tworzy to " +"skórę pomiędzy modelem a podporą." msgctxt "support_bottom_enable label" msgid "Enable Support Floor" -msgstr "Włącz podstawę nośną" +msgstr "Włącz Podłoże Podpory" msgctxt "support_bottom_extruder_nr description" msgid "" "The extruder train to use for printing the floors of the support. This is " "used in multi-extrusion." -msgstr "" -"Element wytłaczarki do drukowania na konstrukcji nośnej na podłożu. Służy do " -"multi-ekstruzji." +msgstr "Ekstruder używany do druku podłoża podpory. Służy do multi-ekstruzji." msgctxt "support_bottom_extruder_nr label" msgid "Support Floor Extruder" -msgstr "Wytłaczarka do struktury podłoża" +msgstr "Ekstruder Podłoża Podpory" msgctxt "support_bottom_height description" msgid "" "The thickness of the support floors. This controls the number of dense " "layers that are printed on top of places of a model on which support rests." msgstr "" -"Grubość płyt nośnych. Steruje liczbę zwartych warstw, które są drukowane z " -"modelem, w którym konstrukcja nośna spoczywa." +"Grubość podłoża podpory. Steruje liczbę zwartych warstw, które są drukowane " +"na modelu, na którym spoczywa podpora." msgctxt "support_bottom_height label" msgid "Support Floor Thickness" -msgstr "Grubość struktury podłogi" +msgstr "Grubość Podłoża Podpory" msgctxt "support_bottom_line_distance description" msgid "" "Distance between the printed support floor lines. This setting is calculated " "by the Support Floor Density, but can be adjusted separately." msgstr "" -"Odległość między drukowanymi liniami podłogowymi podparcia. To ustawienie " -"jest obliczane za pomocą Gęstości podłogi podpór, ale można je wyregulować " +"Odległość między drukowanymi liniami podłoża podpory. To ustawienie jest " +"obliczane za pomocą Gęstość Podłoża Podpory, ale można je wyregulować " "oddzielnie." msgctxt "support_bottom_line_distance label" msgid "Support Floor Line Distance" -msgstr "Odstęp linii struktury podłoża" +msgstr "Odstęp między Liniami Podłoża Podpory" msgctxt "support_bottom_line_width description" msgid "Width of a single support floor line." -msgstr "Szerokość pojedynczej podpory." +msgstr "Szerokość pojedynczej linii podłoża podpory." msgctxt "support_bottom_line_width label" msgid "Support Floor Line Width" -msgstr "Konstrukcja nośna szerokość dolna linia" +msgstr "Szerokość Linii Podłoża Podpory" msgctxt "support_bottom_pattern description" msgid "The pattern with which the floors of the support are printed." -msgstr "Wzorzec, z którym drukowane są podłoża." +msgstr "Wzór, według którego drukowane są podłoża podpory." msgctxt "support_bottom_pattern label" msgid "Support Floor Pattern" -msgstr "Wzorzec Podłogi Wsparcia" +msgstr "Wzór Podłoża Podpory" msgctxt "support_bottom_pattern option concentric" msgid "Concentric" @@ -3648,7 +3618,7 @@ msgstr "Kratka" msgctxt "support_bottom_pattern option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "support_bottom_pattern option triangles" msgid "Triangles" @@ -3665,14 +3635,13 @@ msgid "" "can lead to unstable support structures. Set to zero to turn off the stair-" "like behaviour." msgstr "" -"Wysokość schodów schody podstawy w kształcie struktury nośnej modelu. Niska " -"wartość może usunięcie konstrukcji nośnej, ale zbyt duża wartość może " -"prowadzić do niestabilnej konstrukcji wsporczych. Ustawiony na zero, aby " -"wyłączyć odpowiedzi skokowej." +"Wysokość stopni w schodkowym dole podpory spoczywającej na modelu. Niska " +"wartość utrudnia usunięcie podpory, ale zbyt duża wartość może prowadzić do " +"niestabilnej podpory. Ustaw na zero, aby wyłączyć zachowanie schodkowe." msgctxt "support_bottom_stair_step_height label" msgid "Support Stair Step Height" -msgstr "Wysokość stopnia konstrukcji wsporczej" +msgstr "Wysokość Stopnia Podpory" msgctxt "support_bottom_stair_step_width description" msgid "" @@ -3680,13 +3649,13 @@ msgid "" "on the model. A low value makes the support harder to remove, but too high " "values can lead to unstable support structures." msgstr "" -"Maksymalna szerokość stopni stopnia schodowego podpory oparta na modelu. " -"Niska wartość sprawia, że wsparcie jest trudniejsze do usunięcia, ale zbyt " -"wysokie wartości mogą prowadzić do niestabilnych struktur podparcia." +"Maksymalna szerokość stopni dołu schodkowego podpory opartej na modelu. " +"Niska wartość sprawia, że podpora jest trudniejsza do usunięcia, ale zbyt " +"wysokie wartości mogą prowadzić do niestabilnych podpór." msgctxt "support_bottom_stair_step_width label" msgid "Support Stair Step Maximum Width" -msgstr "Maks. Wysokość stopnia od konstrukcji wsporczej" +msgstr "Maks. Szerokość Stopnia Podpory" msgctxt "support_conical_angle description" msgid "" @@ -3695,110 +3664,106 @@ msgid "" "sturdy, but consist of more material. Negative angles cause the base of the " "support to be wider than the top." msgstr "" -"Kąt nachylenia stożkowego podparcia. Przy 0 stopniach jest pionowa i 90 " -"stopni w poziomie. Mniejsze kąty sprawiają, że podparcie jest bardziej " +"Kąt nachylenia podpory stożkowej. Przy 0 stopniach jest pionowa a przy 90 " +"stopniach jest pozioma. Mniejsze kąty sprawiają, że podparcie jest bardziej " "wytrzymałe, ale składa się z większej ilości materiału. Kąty ujemne " -"powodują, że podstawa wspornika jest szersza niż górna." +"powodują, że podstawa wspornika jest szersza niż góra." msgctxt "support_conical_angle label" msgid "Conical Support Angle" -msgstr "Kąt stożkowy konstrukcji wsporczej" +msgstr "Kąt Podpory Stożkowej" msgctxt "support_conical_enabled description" msgid "" "Experimental feature: Make support areas smaller at the bottom than at the " "overhang." msgstr "" -"Eksperymentalna cecha: W dolnym obszarze podpory powinny być mniejsze niż na " +"Opcja eksperymentalna: W dolnym obszarze podpory powinny być mniejsze niż na " "zwisie." msgctxt "support_conical_enabled label" msgid "Enable Conical Support" -msgstr "Włącz wsparcie stożkowe" +msgstr "Włącz Podpory Stożkowe" msgctxt "support_conical_min_width description" msgid "" "Minimum width to which the base of the conical support area is reduced. " "Small widths can lead to unstable support structures." msgstr "" -"Minimalna szerokość, na którą jest zmniejszona podstawa stożkowego " -"podparcia. Małe szerokości mogą prowadzić do niestabilnych struktur nośnych" +"Minimalna szerokość, do której można zmniejszyć bazę podpory stożkowej. Małe " +"szerokości mogą prowadzić do niestabilnych struktur nośnych." msgctxt "support_conical_min_width label" msgid "Conical Support Minimum Width" -msgstr "Wspornik stożkowy Minimalna szerokość" +msgstr "Min. Szerokość Podpory Stożkowej" msgctxt "support_connect_zigzags description" msgid "" "Connect the ZigZags. This will increase the strength of the zig zag support " "structure." -msgstr "" -"Elementy zygzaka są połączone. To zwiększa wytrzymałość zygzakowatej " -"konstrukcji nośnej." +msgstr "Połącz Zygzaki. To zwiększa wytrzymałość zygzakowatej podpory." msgctxt "support_connect_zigzags label" msgid "Connect Support ZigZags" -msgstr "Zygzakowate łączenia elementów wspierających konstrukcję" +msgstr "Połącz Zygzaki Podpory" msgctxt "support_enable description" msgid "" "Generate structures to support parts of the model which have overhangs. " "Without these structures, such parts would collapse during printing." msgstr "" -"Generowanie struktur wspierających części modelu, które mają zwis. Bez tych " +"Generuj struktury wspierające części modelu, które zwisają. Bez tych " "struktur takie części mogłyby spaść podczas drukowania." msgctxt "support_enable label" msgid "Generate Support" -msgstr "Wygeneruj podpory" +msgstr "Generuj Podpory" msgctxt "support_extruder_nr description" msgid "" "The extruder train to use for printing the support. This is used in multi-" "extrusion." -msgstr "" -"Element wytłaczarki do drukowania na konstrukcji nośnej. Służy do multi-" -"ekstruzji." +msgstr "Ekstruder używany do drukowania podpory. Używane do multi-ekstruzji." msgctxt "support_extruder_nr label" msgid "Support Extruder" -msgstr "Konstrukcja nośna wytłaczarki" +msgstr "Ekstruder Podpory" msgctxt "support_extruder_nr_layer_0 description" msgid "" "The extruder train to use for printing the first layer of support infill. " "This is used in multi-extrusion." msgstr "" -"Wytłaczarka wykorzystuje do drukowania pierwszej warstwy wypełnienia " -"podłoża. Jest on stosowany w wielu wytłaczaniach." +"Ekstruder wykorzystywany do drukowania pierwszej warstwy wypełnienia " +"podpory. Używane do multi-ekstruzji." msgctxt "support_extruder_nr_layer_0 label" msgid "First Layer Support Extruder" -msgstr "Pierwsza warstwa wspierająca wytłaczarkę" +msgstr "Ekstruder Pierwszej Warstwy Podpory" msgctxt "support_infill_extruder_nr description" msgid "" "The extruder train to use for printing the infill of the support. This is " "used in multi-extrusion." msgstr "" -"Element wytłaczarki do drukowania napełnianie konstrukcji nośnej. Służy do " -"multi-ekstruzji." +"Ekstruder wykorzystywany do drukowania wypełnienia podpory. Używane do multi-" +"ekstruzji." msgctxt "support_infill_extruder_nr label" msgid "Support Infill Extruder" -msgstr "Wytłaczarka do wypełniania strukturę nośną" +msgstr "Ekstruder Wypełnienia Podpory" msgctxt "support_infill_rate description" msgid "" "Adjusts the density of the support structure. A higher value results in " "better overhangs, but the supports are harder to remove." msgstr "" -"Reguluje gęstość konstrukcji wsporczej. Wyższa wartość powoduje lepsze " -"zwisy, ale podpory są trudniejsze do usunięcia." +"Reguluje gęstość struktury podpory. Wyższa wartość powoduje lepsze zwisy, " +"ale podpory są trudniejsze do usunięcia." msgctxt "support_infill_rate label" msgid "Support Density" -msgstr "Gęstość konstrukcji nośnej" +msgstr "Gęstość Podpory" msgctxt "support_interface_density description" msgid "" @@ -3806,12 +3771,12 @@ msgid "" "higher value results in better overhangs, but the supports are harder to " "remove." msgstr "" -"Dostosowuje gęstość dachów i podłóg konstrukcji nośnej. Wyższa wartość " -"powoduje lepsze zwisy, ale podpory są trudniejsze do usunięcia." +"Dostosowuje gęstość dachów i podłoży podpory. Wyższa wartość powoduje lepsze " +"zwisy, ale podpory są trudniejsze do usunięcia." msgctxt "support_interface_density label" msgid "Support Interface Density" -msgstr "Gęstość interfejsu pomocniczego" +msgstr "Gęstość Połączenia Podpory" msgctxt "support_interface_enable description" msgid "" @@ -3819,55 +3784,54 @@ msgid "" "create a skin at the top of the support on which the model is printed and at " "the bottom of the support, where it rests on the model." msgstr "" -"Generuje szczelne połączenie pomiędzy modelem i konstrukcją nośną. To tworzy " -"skóry na górnej części konstrukcji nośnej, na której model jest drukowany i " -"spód konstrukcji nośnej, gdzie opiera się na modelu." +"Generuje szczelne połączenie pomiędzy modelem a podporą. Tworzy to skórę na " +"górnej części podpory, na której model jest drukowany i na spodzie, gdzie " +"podpora spoczywa na modelu." msgctxt "support_interface_enable label" msgid "Enable Support Interface" -msgstr "Włącz interfejs wsparcia" +msgstr "Włącz Połączenie Podpory" msgctxt "support_interface_extruder_nr description" msgid "" "The extruder train to use for printing the roofs and floors of the support. " "This is used in multi-extrusion." msgstr "" -"Element wytłaczarki do drukowania na dachy i podłogi konstrukcji nośnej. " -"Służy do multi-ekstruzji." +"Ekstruder wykorzystywany do drukowania dachów i podłoży podpory. Używane do " +"multi-ekstruzji." msgctxt "support_interface_extruder_nr label" msgid "Support Interface Extruder" -msgstr "Wytłaczarka interfejsu wspomagającego" +msgstr "Ekstruder Połączenia Podpory" msgctxt "support_interface_height description" msgid "" "The thickness of the interface of the support where it touches with the " "model on the bottom or the top." msgstr "" -"Grubość styku konstrukcji nośnej, gdzie styka się ona Model powyżej i " -"poniżej." +"Grubość połączenia podpory, gdzie styka się ona z modelem na górze i na dole." msgctxt "support_interface_height label" msgid "Support Interface Thickness" -msgstr "Grubość interfejsu konstrukcja wsporcza" +msgstr "Grubość Połączenia Podpory" msgctxt "support_interface_line_width description" msgid "Width of a single line of support roof or floor." -msgstr "Szerokość pojedynczej linii podparcia dachu lub podłogi." +msgstr "Szerokość pojedynczej linii dachu lub podłogi podpory." msgctxt "support_interface_line_width label" msgid "Support Interface Line Width" -msgstr "Szerokość linii interfejsu podpór" +msgstr "Szerokość Linii Połączenia Podpory" msgctxt "support_interface_pattern description" msgid "" "The pattern with which the interface of the support with the model is " "printed." -msgstr "Wzorzec, z którym drukowany jest interfejs nośnika z modelem." +msgstr "Wzór, z jakim drukowane jest połączenie podpory z modelem." msgctxt "support_interface_pattern label" msgid "Support Interface Pattern" -msgstr "Wzór interfejs konstrukcja nośna" +msgstr "Wzór Połączenia Podpory" msgctxt "support_interface_pattern option concentric" msgid "Concentric" @@ -3883,7 +3847,7 @@ msgstr "Kratka" msgctxt "support_interface_pattern option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "support_interface_pattern option triangles" msgid "Triangles" @@ -3900,14 +3864,14 @@ msgid "" "cause normal support to be printed in some places where there should have " "been support interface." msgstr "" -"Sprawdzając, gdzie znajduje się model powyżej i poniżej wspornika, wykonaj " -"kroki na danej wysokości. Niższe wartości będą łamywać wolniej, podczas gdy " -"wyższe wartości mogą powodować drukowanie zwykłego nośnika w niektórych " -"miejscach, w których powinien istnieć interfejs obsługi." +"Sprawdzając, czy model znajduje się powyżej czy poniżej podpory, wykonaj " +"stopnie o danej wysokości. Niższe wartości będą cięte wolniej, podczas gdy " +"wyższe wartości mogą powodować drukowanie zwykłej podpory w niektórych " +"miejscach, w których powinno istnieć połączenie." msgctxt "support_interface_skip_height label" msgid "Support Interface Resolution" -msgstr "Rozdzielczość interfejs konstrukcja nośna" +msgstr "Rozdzielczość Połączenia Podpory" msgctxt "support_join_distance description" msgid "" @@ -3915,33 +3879,32 @@ msgid "" "seperate structures are closer together than this value, the structures " "merge into one." msgstr "" -"Maksymalna odległość między konstrukcjami nośnymi w kierunkach X / Y. Gdy " -"oddzielne struktury są bliżej siebie niż ta wartość, struktury łączą się w " -"jedną." +"Maksymalna odległość między podporami w kierunkach X/Y. Gdy oddzielne " +"struktury są bliżej siebie niż ta wartość, struktury łączą się w jedną." msgctxt "support_join_distance label" msgid "Support Join Distance" -msgstr "Odległość do łączenia struktur wsparcia" +msgstr "Odległość Łączenia Podpór" msgctxt "support_line_distance description" msgid "" "Distance between the printed support structure lines. This setting is " "calculated by the support density." msgstr "" -"Odległość między drukowanymi liniami nośnymi. To ustawienie jest obliczane " -"przez gęstość nośną." +"Odległość między drukowanymi liniami struktury podpory. To ustawienie jest " +"obliczane przez gęstość podpory." msgctxt "support_line_distance label" msgid "Support Line Distance" -msgstr "Odstępy między wierszami konstrukcji nośnej" +msgstr "Odstępy między Liniami Podpory" msgctxt "support_line_width description" msgid "Width of a single support structure line." -msgstr "Szerokość jednej linii konstrukcji nośnej." +msgstr "Szerokość jednej linii podpory." msgctxt "support_line_width label" msgid "Support Line Width" -msgstr "Szerokość linii podpór" +msgstr "Szerokość Linii Podpory" msgctxt "support_mesh description" msgid "" @@ -3949,60 +3912,59 @@ msgid "" "structure." msgstr "" "Użyj tej siatki, aby określić obszary wsparcia. Można to wykorzystać do " -"generowania struktury nośnej." +"generowania struktury podpory." msgctxt "support_mesh label" msgid "Support Mesh" -msgstr "Wsparcie siatki" +msgstr "Siatka Podpory" msgctxt "support_mesh_drop_down description" msgid "" "Make support everywhere below the support mesh, so that there's no overhang " "in the support mesh." msgstr "" -"Wspieraj wszędzie pod siatką podpory, tak aby nie było zwisu w siatce " +"Twórz podpory wszędzie pod siatką podpory, tak aby nie było zwisu w siatce " "podpory." msgctxt "support_mesh_drop_down label" msgid "Drop Down Support Mesh" -msgstr "Siatka wsparcia Drop Down" +msgstr "Upuść Siatkę Podpory" msgctxt "support_minimal_diameter description" msgid "" "Minimum diameter in the X/Y directions of a small area which is to be " "supported by a specialized support tower." msgstr "" -"Minimalna średnica w X / Y kierunkach o małej powierzchni, który jest " -"obsługiwany przez specjalne podpory nośne." +"Minimalna średnica w kierunkach X/Y o małej powierzchni, który jest " +"wspierana przez specjalną wieżę wspierającą." msgctxt "support_minimal_diameter label" msgid "Minimum Diameter" -msgstr "Minimalna średnica" +msgstr "Minimalna Średnica" msgctxt "support_offset description" msgid "" "Amount of offset applied to all support polygons in each layer. Positive " "values can smooth out the support areas and result in more sturdy support." msgstr "" -"Odstęp, który jest stosowany do wielokątów w poszczególnych warstwach. " -"Wartości dodatnie mogą wygładzić elementy nośne, a tym samym zapewnić " -"bardziej stabilną konstrukcję nośną." +"Wartość nakładania się stosowana do wszystkich podpór na każdej warstwie. " +"Dodatnie wartości mogą wygładzić podpory co w rezultacie daje silne podpory." msgctxt "support_offset label" msgid "Support Horizontal Expansion" -msgstr "Ekspansja pozioma konstrukcji nośnej" +msgstr "Poszerzenie Podpór Poziome" msgctxt "support_pattern description" msgid "" "The pattern of the support structures of the print. The different options " "available result in sturdy or easy to remove support." msgstr "" -"Wzór struktury nośnej druku. Różne opcje zapewniają trwałe lub łatwe do " -"demontażu podparcie." +"Wzór struktury podpory wydruku. Różne opcje zapewniają trwałe lub łatwe do " +"usunięcia podpory." msgctxt "support_pattern label" msgid "Support Pattern" -msgstr "Wzorzec wsparcia/podpory" +msgstr "Wzór Podpory" msgctxt "support_pattern option concentric" msgid "Concentric" @@ -4018,7 +3980,7 @@ msgstr "Kratka" msgctxt "support_pattern option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "support_pattern option triangles" msgid "Triangles" @@ -4033,77 +3995,77 @@ msgid "" "The density of the roofs of the support structure. A higher value results in " "better overhangs, but the supports are harder to remove." msgstr "" -"Gęstość dachów konstrukcji nośnej. Wyższa wartość powoduje lepsze zwisy, ale " -"podpory są trudniejsze do usunięcia." +"Gęstość dachów podpór. Wyższa wartość powoduje lepsze zwisy, ale podpory są " +"trudniejsze do usunięcia." msgctxt "support_roof_density label" msgid "Support Roof Density" -msgstr "Wspieraj gęstość dachu" +msgstr "Gęstość Dachu Podpory" msgctxt "support_roof_enable description" msgid "" "Generate a dense slab of material between the top of support and the model. " "This will create a skin between the model and support." msgstr "" -"Wytworzyć gęstą płytę materiału pomiędzy wierzchołkiem podparcia a modelem. " -"Powoduje to powstanie skóry między modelem a wsparciem." +"Wytwórz gęstą płytę materiału pomiędzy wierzchołkiem podpory a modelem. " +"Powoduje to powstanie skóry między modelem a podporą." msgctxt "support_roof_enable label" msgid "Enable Support Roof" -msgstr "Włącz podpory nośne dachu/zwisu" +msgstr "Włącz Dach Podpory" msgctxt "support_roof_extruder_nr description" msgid "" "The extruder train to use for printing the roofs of the support. This is " "used in multi-extrusion." msgstr "" -"Element wytłaczarki do drukowania na konstrukcji wsporczej dachu. Służy do " -"multi-ekstruzji." +"Ekstruder wykorzystywany do drukowania dachów podpory. Używany do multi-" +"ekstruzji." msgctxt "support_roof_extruder_nr label" msgid "Support Roof Extruder" -msgstr "Wspomaganie ekstruzji dachowej" +msgstr "Ekstruder Dachu Podpory" msgctxt "support_roof_height description" msgid "" "The thickness of the support roofs. This controls the amount of dense layers " "at the top of the support on which the model rests." msgstr "" -"Grubość dachu nośnej. Steruje ilość gęstej warstwy na górnej części " -"konstrukcji nośnej, w którym model jest w pozycji siedzącej." +"Grubość dachu podpory. Steruje ilością gęstych warstw na górnej części " +"podpory, na której osiada model." msgctxt "support_roof_height label" msgid "Support Roof Thickness" -msgstr "Grubość warstwy nośnej dachu/zwisu" +msgstr "Grubość Dachu Podpory" msgctxt "support_roof_line_distance description" msgid "" "Distance between the printed support roof lines. This setting is calculated " "by the Support Roof Density, but can be adjusted separately." msgstr "" -"Odległość pomiędzy drukowanych linii nośnych dachu. Regulacja ta jest " -"obliczona na podstawie gęstości struktury nośnej, ale może być także " -"ustawiony oddzielnie." +"Odległość pomiędzy drukowanymi liniami dachu podpory. Ta opcja jest " +"obliczona na podstawie Gęstości Podpory, ale może być także ustawiona " +"oddzielnie." msgctxt "support_roof_line_distance label" msgid "Support Roof Line Distance" -msgstr "Wsparcie dla linii dachowej" +msgstr "Odległość Linii Dachu Podpory" msgctxt "support_roof_line_width description" msgid "Width of a single support roof line." -msgstr "Szerokość pojedynczej podpory dachowej." +msgstr "Szerokość pojedynczej linii dachu podpory." msgctxt "support_roof_line_width label" msgid "Support Roof Line Width" -msgstr "Podpory szerokości linii dachu" +msgstr "Szerokość Linii Dachu Podpory" msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." -msgstr "Wzór, na którym są drukowane nad dachami podpory." +msgstr "Wzór, z jakim drukowane są dachy podpory." msgctxt "support_roof_pattern label" msgid "Support Roof Pattern" -msgstr "Wsparcie Wzoru Dachu" +msgstr "Wzór Dachu Podpory" msgctxt "support_roof_pattern option concentric" msgid "Concentric" @@ -4119,7 +4081,7 @@ msgstr "Kratka" msgctxt "support_roof_pattern option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "support_roof_pattern option triangles" msgid "Triangles" @@ -4131,31 +4093,31 @@ msgstr "Zygzak" msgctxt "support_top_distance description" msgid "Distance from the top of the support to the print." -msgstr "Odległość od wierzchołka podpory do nadruku." +msgstr "Odległość od wierzchołka podpory do wydruku." msgctxt "support_top_distance label" msgid "Support Top Distance" -msgstr "Górny rozstaw struktury wsparcia" +msgstr "Odległość od Góry Podpory" msgctxt "support_tower_diameter description" msgid "The diameter of a special tower." -msgstr "Średnica specjalnych filarów." +msgstr "Średnica wieży specjalnej." msgctxt "support_tower_diameter label" msgid "Tower Diameter" -msgstr "Średnica filarów" +msgstr "Średnica Wieży" msgctxt "support_tower_roof_angle description" msgid "" "The angle of a rooftop of a tower. A higher value results in pointed tower " "roofs, a lower value results in flattened tower roofs." msgstr "" -"Kąt dachu filar. Wyższa wartość wskazał dachy filar spowodować, niższą " -"wartość spowoduje płytszych dachów filaru." +"Kąt dachu wieży. Wyższa wartość powoduje punktowy dach wieży, a niższa " +"wartość powoduje płaskie dachy wieży." msgctxt "support_tower_roof_angle label" msgid "Tower Roof Angle" -msgstr "Kąt filarów dachowych" +msgstr "Kąt Dachu Wieży" msgctxt "support_type description" msgid "" @@ -4163,17 +4125,17 @@ msgid "" "touching build plate or everywhere. When set to everywhere the support " "structures will also be printed on the model." msgstr "" -"Reguluje rozmieszczenie struktur nośnych. Umiejscowienie można ustawić tak, " -"aby dotykać płyty budowlanej lub wszędzie. Po ustawieniu na wszędzie " -"struktury wydruku będą również drukowane na modelu." +"Reguluje rozmieszczenie podpór. Umiejscowienie można dostosować tak, aby " +"dotykały tylko stołu roboczego lub były generowane wszędzie. Po ustawieniu " +"na wszędzie struktury wydruku będą również drukowane na modelu." msgctxt "support_type label" msgid "Support Placement" -msgstr "Miejsce wsparcia" +msgstr "Rozmieszczenie Podpór" msgctxt "support_type option buildplate" msgid "Touching Buildplate" -msgstr "Dotykając stołu" +msgstr "Dotykające Stołu" msgctxt "support_type option everywhere" msgid "Everywhere" @@ -4185,30 +4147,30 @@ msgid "" "larger diameter than the region they support. Near the overhang the towers' " "diameter decreases, forming a roof." msgstr "" -"Stosowane specjalne słupy wspierajace małe zwisy. Te filary mają średnicę " -"większą niż obsługiwanym z nich obszaru. W pobliżu występu, średnica kolumn, " -"w wyniku powstawania dachu zmniejszyć." +"Użyj specjalnych wież do wspierania malutkich nawisów. Te wieże mają " +"średnicę większą niż wspierany obszar. W pobliżu nawisu, średnica wież " +"zmniejsza się tworząc dach." msgctxt "support_use_towers label" msgid "Use Towers" -msgstr "Korzystanie z filarów" +msgstr "Używaj Wież" msgctxt "support_xy_distance description" msgid "Distance of the support structure from the print in the X/Y directions." -msgstr "Odległość konstrukcji nośnej od nadruku w kierunkach X / Y." +msgstr "Odległość podpory od wydruku w kierunkach X/Y." msgctxt "support_xy_distance label" msgid "Support X/Y Distance" -msgstr "X / Y odległości od konstrukcji wsporczej" +msgstr "Odległość X/Y Podpory" msgctxt "support_xy_distance_overhang description" msgid "" "Distance of the support structure from the overhang in the X/Y directions. " -msgstr "Odległość konstrukcji nośnej od zwisu w kierunkach X / Y." +msgstr "Odległość podpory od zwisu w kierunkach X/Y " msgctxt "support_xy_distance_overhang label" msgid "Minimum Support X/Y Distance" -msgstr "Minimalna odległość X / Y wsparcia" +msgstr "Min. Odległość X/Y Podpory" msgctxt "support_xy_overrides_z description" msgid "" @@ -4217,22 +4179,22 @@ msgid "" "the model, influencing the actual Z distance to the overhang. We can disable " "this by not applying the X/Y distance around overhangs." msgstr "" -"Niezależnie od tego, czy odległość X / Y wspornika zastępuje dystans Złącza " -"Wsparcia lub odwrotnie. Kiedy X / Y zignoruje Z, odległość X / Y może " -"odepchnąć podparcie od modelu, wpływając na rzeczywistą odległość Z do " -"zwisu. Możemy to wyłączyć, nie stosując odległości X / Y wokół zwisów." +"Czy Odległość Podpory X/Y nadpisuje Odległość Podpory Z i vice versa. Kiedy " +"X/Y nadpisuje Z, odległość X/Y może odepchnąć podporę od modelu, wpływając " +"na rzeczywistą odległość Z do zwisu. Możemy to wyłączyć, nie stosując " +"odległości X/Y wokół zwisów." msgctxt "support_xy_overrides_z label" msgid "Support Distance Priority" -msgstr "Priorytet dystansu wsparcia" +msgstr "Priorytet Odległości Podpory" msgctxt "support_xy_overrides_z option xy_overrides_z" msgid "X/Y overrides Z" -msgstr "X / Y zastępuje Z" +msgstr "X/Y nadpisuje Z" msgctxt "support_xy_overrides_z option z_overrides_xy" msgid "Z overrides X/Y" -msgstr "Z zastępuje X / Y" +msgstr "Z nadpisuje X/Y" msgctxt "support_z_distance description" msgid "" @@ -4240,66 +4202,67 @@ msgid "" "provides clearance to remove the supports after the model is printed. This " "value is rounded up to a multiple of the layer height." msgstr "" -"Odległość od góry / dołu struktury nośnej do nadruku. Ta luka zapewnia luz, " -"aby usunąć wsporniki po wydrukowaniu modelu. Ta wartość jest zaokrąglana do " +"Odległość od góry/dołu podpory do wydruku. Ta luka zapewnia luz, aby usunąć " +"wsporniki po wydrukowaniu modelu. Ta wartość jest zaokrąglana do " "wielokrotności wysokości warstwy." msgctxt "support_z_distance label" msgid "Support Z Distance" -msgstr "Odległości osi Z od konstrukcji wsporczej" +msgstr "Odległość Podpory Z" msgctxt "switch_extruder_prime_speed description" msgid "" "The speed at which the filament is pushed back after a nozzle switch " "retraction." msgstr "" -"Prędkość, w której włókno jest odepchniente po wycofaniu przełącznika dyszy." +"Prędkość, z jaką filament jest cofany podczas retrakcji po zmianie dyszy." msgctxt "switch_extruder_prime_speed label" msgid "Nozzle Switch Prime Speed" -msgstr "Szybkość podawania przełącznik dyszy (wciągania)" +msgstr "Prędk. Czyszcz. przy Zmianie Dyszy" msgctxt "switch_extruder_retraction_amount description" msgid "" "The amount of retraction: Set at 0 for no retraction at all. This should " "generally be the same as the length of the heat zone." msgstr "" -"Ilość wycofania: Ustaw na 0, aby nie wycofać się. To powinno generalnie być " -"takie samo jak długość strefy grzewczej." +"Długość retrakcji: Ustaw na 0, aby wyłączyć retrkację. To powinno ogólnie " +"być takie samo jak długość strefy grzewczej." msgctxt "switch_extruder_retraction_amount label" msgid "Nozzle Switch Retraction Distance" -msgstr "Odległość odsunięcia przełącznika dyszy" +msgstr "Długość Retrakcji przy Zmianie Dyszy" msgctxt "switch_extruder_retraction_speed description" msgid "" "The speed at which the filament is retracted during a nozzle switch retract." msgstr "" -"Prędkość, z jaką włókna są wycofywane podczas wysuwu przełącznika dyszy." +"Prędkość, z jaką filament jest wycofywany podczas retrakcji przy zmianie " +"dyszy." msgctxt "switch_extruder_retraction_speed label" msgid "Nozzle Switch Retract Speed" -msgstr "Szybkość wycofywania przełącznika dyszy" +msgstr "Prędk. Cofania przy Zmianie Dyszy" msgctxt "switch_extruder_retraction_speeds description" msgid "" "The speed at which the filament is retracted. A higher retraction speed " "works better, but a very high retraction speed can lead to filament grinding." msgstr "" -"Prędkość, z jaką włókna są wycofywane. Wyższa szybkość wysuwania działa " -"lepiej, ale bardzo duża szybkość wycofywania może prowadzić do złych efektów." +"Prędkość, z jaką filament jest wycofywany. Wyższa szybkość retrakcji działa " +"lepiej, ale bardzo duża szybkość retrakcji może prowadzić do złych efektów." msgctxt "switch_extruder_retraction_speeds label" msgid "Nozzle Switch Retraction Speed" -msgstr "Prędkość wycofania przełącznika dyszy" +msgstr "Prędk. Retrakcji przy Zmianie Dyszy" msgctxt "top_bottom_pattern description" msgid "The pattern of the top/bottom layers." -msgstr "Wzór górnej / dolnej warstwy." +msgstr "Wzór górnej/dolnej warstwy." msgctxt "top_bottom_pattern label" msgid "Top/Bottom Pattern" -msgstr "Dolny/Górny Wzór" +msgstr "Wzór Góra/Dół" msgctxt "top_bottom_pattern option concentric" msgid "Concentric" @@ -4307,7 +4270,7 @@ msgstr "Koncentryczny" msgctxt "top_bottom_pattern option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" @@ -4315,11 +4278,11 @@ msgstr "Zygzak" msgctxt "top_bottom_pattern_0 description" msgid "The pattern on the bottom of the print on the first layer." -msgstr "Wzorzec na dole wydruku na pierwszej warstwie." +msgstr "Wzór na pierwszej warstwie na dole wydruku." msgctxt "top_bottom_pattern_0 label" msgid "Bottom Pattern Initial Layer" -msgstr "Dolna warstwa początkowa " +msgstr "Wzór Dolnej Początkowej Warstwy" msgctxt "top_bottom_pattern_0 option concentric" msgid "Concentric" @@ -4327,7 +4290,7 @@ msgstr "Koncentryczny" msgctxt "top_bottom_pattern_0 option lines" msgid "Lines" -msgstr "Liniowy" +msgstr "Linie" msgctxt "top_bottom_pattern_0 option zigzag" msgid "Zig Zag" @@ -4338,12 +4301,12 @@ msgid "" "The thickness of the top/bottom layers in the print. This value divided by " "the layer height defines the number of top/bottom layers." msgstr "" -"Grubość górnej / dolnej warstwy druku. Ta wartość podzielona przez wysokość " -"warstwy definiuje liczbę warstw wierzchnich / dolnych." +"Grubość górnej/dolnej warstwy wydruku. Ta wartość podzielona przez wysokość " +"warstwy definiuje liczbę warstw górnych/dolnych." msgctxt "top_bottom_thickness label" msgid "Top/Bottom Thickness" -msgstr "Grubość górnej i dolnej" +msgstr "Grubość Góra/Dół" msgctxt "top_layers description" msgid "" @@ -4351,7 +4314,7 @@ msgid "" "is rounded to a whole number." msgstr "" "Liczba górnych warstw. Przy obliczaniu górnej grubości wartość ta jest " -"zaokrąglana do liczby całkowitej" +"zaokrąglana do liczby całkowitej." msgctxt "top_layers label" msgid "Top Layers" @@ -4362,88 +4325,89 @@ msgid "" "The thickness of the top layers in the print. This value divided by the " "layer height defines the number of top layers." msgstr "" -"Grubość górnych warstw w druku. Ta wartość podzielona przez wysokość warstwy " -"definiuje liczbę warstw górnych." +"Grubość górnych warstw na wydruku. Ta wartość podzielona przez wysokość " +"warstwy definiuje liczbę warstw górnych." msgctxt "top_thickness label" msgid "Top Thickness" -msgstr "Górna Grubość" +msgstr "Grubość Góra" msgctxt "travel description" msgid "travel" -msgstr "Ruch" +msgstr "ruch jałowy" msgctxt "travel label" msgid "Travel" -msgstr "Podróżować" +msgstr "Ruch Jałowy" msgctxt "travel_avoid_distance description" msgid "" "The distance between the nozzle and already printed parts when avoiding " "during travel moves." msgstr "" -"Odległość między dyszą a już drukowanych elementów, gdy są one pominięte w " -"ruchu." +"Odległość między dyszą a już wydrukowanym elementem, gdy są one omijane " +"podczas ruchu jałowego." msgctxt "travel_avoid_distance label" msgid "Travel Avoid Distance" -msgstr "Podróże Unikaj Odległość" +msgstr "Odległość Omijania Ruchu Jałowego" msgctxt "travel_avoid_other_parts description" msgid "" "The nozzle avoids already printed parts when traveling. This option is only " "available when combing is enabled." msgstr "" -"Dysza unika już podczas drukowania drukowanych części. Ta opcja jest " -"dostępna tylko w przypadku włączenia uników dyszy." +"Dysza unika już wydrukowanych części podczas ruchu jałowego. Ta opcja jest " +"dostępna tylko w przypadku włączonego trybu kombinowania." msgctxt "travel_avoid_other_parts label" msgid "Avoid Printed Parts When Traveling" -msgstr "Unikaj drukowanych części podczas podróży" +msgstr "Unikaj Wydruk. Części Podczas Ruchu Jałowego" msgctxt "travel_compensate_overlapping_walls_0_enabled description" msgid "" "Compensate the flow for parts of an outer wall being printed where there is " "already a wall in place." msgstr "" -"Kompensuje przepływ części ścian zewnętrznych, które są drukowane, gdy jest " -"już na miejscu." +"Kompensuje przepływ dla części, których zewnętrzna ściana jest drukowana " +"kiedy jest już w tym miejscu ściana." msgctxt "travel_compensate_overlapping_walls_0_enabled label" msgid "Compensate Outer Wall Overlaps" -msgstr "Kompensuj zewnętrzne zakładki ścienne" +msgstr "Komp. Zewn. Nakład. się Ścian" msgctxt "travel_compensate_overlapping_walls_enabled description" msgid "" "Compensate the flow for parts of a wall being printed where there is already " "a wall in place." msgstr "" -"Kompensuj przepływ części drukowanej ścianki, w której znajduje się już " -"ściana." +"Kompensuje przepływ dla części, których ściana jest drukowana kiedy jest już " +"w tym miejscu ściana." msgctxt "travel_compensate_overlapping_walls_enabled label" msgid "Compensate Wall Overlaps" -msgstr "Kompensacyjne nakładki na ściany" +msgstr "Kompensuj Nakładanie się Ścian" msgctxt "travel_compensate_overlapping_walls_x_enabled description" msgid "" "Compensate the flow for parts of an inner wall being printed where there is " "already a wall in place." msgstr "" -"Kompensuje przepływ części wewnętrznej ściany drukowanej, gdy jest już na " -"miejscu." +"Kompensuje przepływ dla części, których wewnętrzna ściana jest drukowana " +"kiedy jest już w tym miejscu ściana." msgctxt "travel_compensate_overlapping_walls_x_enabled label" msgid "Compensate Inner Wall Overlaps" -msgstr "Kompensuj wewnętrzne zakładki" +msgstr "Komp. Wewn. Nakład. się Ścian" msgctxt "travel_retract_before_outer_wall description" msgid "Always retract when moving to start an outer wall." -msgstr "Zawsze cofaj się podczas ruszania, aby rozpocząć zewnętrzną ścianę." +msgstr "" +"Zawsze cofaj podczas przemieszczania się do początku zewnętrznej ściany." msgctxt "travel_retract_before_outer_wall label" msgid "Retract Before Outer Wall" -msgstr "Cofnij przed ścianą zewnętrzną" +msgstr "Cofnij Przed Zewn. Ścianą" msgctxt "wall_0_inset description" msgid "" @@ -4453,35 +4417,37 @@ msgid "" "outside of the model." msgstr "" "Wkład nałożony na ścieżkę zewnętrznej ściany. Jeśli zewnętrzna ścianka jest " -"mniejsza niż dysza i nadrukowana po wewnętrznych ściankach, użyj tego " -"przesunięcia, aby uzyskać otwór w dyszy zachodzić na siebie na wewnętrzne " -"ściany zamiast na zewnątrz modelu." +"mniejsza niż dysza i jest drukowana po wewnętrznych ściankach, użyj tego " +"przesunięcia, aby uzyskać otwór w dyszy, żeby nakładała się z wewnętrzną " +"ścianą zamiast być na zewnątrz modelu." msgctxt "wall_0_inset label" msgid "Outer Wall Inset" -msgstr "Zewnętrzna osłona ścienna" +msgstr "Wkład Zewn. Ściany" msgctxt "wall_0_wipe_dist description" msgid "" "Distance of a travel move inserted after the outer wall, to hide the Z seam " "better." -msgstr "Usunięcie ruchu ściany zewnętrznej, w celu ukrycia Z-szew lepiej." +msgstr "" +"Długość ruchu jałowego umieszczonego po wydrukowaniu zewnętrznej ściany, aby " +"lepiej ukryć szew Z." msgctxt "wall_0_wipe_dist label" msgid "Outer Wall Wipe Distance" -msgstr "Odległość od ściany zewnętrznej" +msgstr "Długość Czyszczenia Zewn. Ściana" msgctxt "wall_line_count description" msgid "" "The number of walls. When calculated by the wall thickness, this value is " "rounded to a whole number." msgstr "" -"Liczba ścian. Przy obliczaniu grubości ścianki ta wartość jest zaokrąglana " -"do liczby całkowitej." +"Liczba ścian. Przy obliczaniu za pomocą grubości ściany, ta wartość jest " +"zaokrąglana do liczby całkowitej." msgctxt "wall_line_count label" msgid "Wall Line Count" -msgstr "Liczba linii ściany" +msgstr "Ilość Ścian" msgctxt "wall_line_width description" msgid "Width of a single wall line." @@ -4489,30 +4455,30 @@ msgstr "Szerokość jednej linii ściany." msgctxt "wall_line_width label" msgid "Wall Line Width" -msgstr "Szerokość linii ściennych" +msgstr "Szerokość Linii Ściany" msgctxt "wall_line_width_0 description" msgid "" "Width of the outermost wall line. By lowering this value, higher levels of " "detail can be printed." msgstr "" -"Szerokość linii najbliższa zewnętrznej ścianie. Przez obniżenie tej wartości " -"wyższe poziomy szczegółów mogą być drukowane." +"Szerokość zewnętrznej linii ściany. Przez obniżenie tej wartości wyższe " +"poziomy szczegółów mogą być drukowane." msgctxt "wall_line_width_0 label" msgid "Outer Wall Line Width" -msgstr "Szerokość linii ścian zewnętrznych" +msgstr "Szerokość Linii Ściany Zewn." msgctxt "wall_line_width_x description" msgid "" "Width of a single wall line for all wall lines except the outermost one." msgstr "" -"Szerokość jednej linii dla wszystkich linii ściany z wyjątkiem jednej " +"Szerokość jednej linii dla wszystkich linii ściany z wyjątkiem jednej " "najbardziej zewnętrznej." msgctxt "wall_line_width_x label" msgid "Inner Wall(s) Line Width" -msgstr "Szerokość linii ścian wewnętrznych" +msgstr "Szerokość Linii Ściany Wewn." msgctxt "wall_thickness description" msgid "" @@ -4520,19 +4486,19 @@ msgid "" "divided by the wall line width defines the number of walls." msgstr "" "Grubość ścian zewnętrznych w kierunku poziomym. Ta wartość podzielona przez " -"szerokość linii ściennej określa liczbę ścian." +"szerokość linii ściany określa liczbę ścian." msgctxt "wall_thickness label" msgid "Wall Thickness" -msgstr "Grubość ścianki" +msgstr "Grubość Ściany" msgctxt "wireframe_bottom_delay description" msgid "Delay time after a downward move. Only applies to Wire Printing." -msgstr "Opóźnienie po przejściu w dół. Dotyczy tylko Drukowania drutu." +msgstr "Opóźnienie po pochyłym ruchu. Dotyczy tylko Drukowania Drutu." msgctxt "wireframe_bottom_delay label" msgid "WP Bottom Delay" -msgstr "W dół opóźnienia w drukowaniu ze strukturą drucianą" +msgstr "DD Dolne Opóźnienie" msgctxt "wireframe_drag_along description" msgid "" @@ -4540,13 +4506,13 @@ msgid "" "with the diagonally downward extrusion. This distance is compensated for. " "Only applies to Wire Printing." msgstr "" -"Odległość, z jaką przecina się materiał wytłoczony do góry wraz z " -"wytłoczeniem po przekątnej. Ta odległość jest kompensowana. Dotyczy tylko " -"Drukowania drutu." +"Odległość, z jaką materiał wytłoczony z góry jest przeciągany równolegle do " +"dolnej ekstruzji. Ta odległość jest kompensowana. Dotyczy tylko Drukowania " +"Drutu." msgctxt "wireframe_drag_along label" msgid "WP Drag Along" -msgstr "Dokręcić przypadku drukowania ze strukturą drucianą" +msgstr "DD Przeciągnij Wzdłuż" msgctxt "wireframe_enabled description" msgid "" @@ -4558,23 +4524,23 @@ msgstr "" "Wydrukuj tylko zewnętrzną powierzchnię o słabej strukturze tkaniny, drukując " "\"w cienkim powietrzu\". Jest to realizowane poprzez poziomy wydruk konturów " "modelu w określonych przedziałach Z, które są połączone przez linie " -"skierowane w górę iw dół." +"skierowane w górę i w dół po porzekątnej." msgctxt "wireframe_enabled label" msgid "Wire Printing" -msgstr "Drukowanie druków" +msgstr "Drukowanie Drutu" msgctxt "wireframe_fall_down description" msgid "" "Distance with which the material falls down after an upward extrusion. This " "distance is compensated for. Only applies to Wire Printing." msgstr "" -"Odległość spada materiału przez wytłaczanie w górę. Trasa ta jest " -"kompensowana. Odnosi się tylko do drukowania ze strukturą drucianą." +"Odległość o jaką spada materiału przez wytłaczanie w górę. Długość ta jest " +"kompensowana. Odnosi się tylko do Drukowania Drutu" msgctxt "wireframe_fall_down label" msgid "WP Fall Down" -msgstr "Upaść podczas strukturze drutu drukowanie" +msgstr "DD Spadek" msgctxt "wireframe_flat_delay description" msgid "" @@ -4582,47 +4548,46 @@ msgid "" "cause better adhesion to previous layers at the connection points, while too " "long delays cause sagging. Only applies to Wire Printing." msgstr "" -"Czas opóźnienia dwóch poziomych odcinków. Dzięki takiej zwłoki lepsze " -"przyleganie można uzyskać w punktach połączeń z poprzednich warstwach; przy " -"zbyt dużym opóźnieniem może jednak prowadzić do zatonięcia komponentów. " -"Odnosi się tylko do drukowania ze strukturą drucianą." +"Czas opóźnienia pomiędzy dwoma poziomymi segmentami. Dzięki takiemu " +"opóźnieniu może powstać lepsza przyczepność do poprzedniej warstwy, przy " +"zbyt dużym opóźnieniu może jednak prowadzić do opadania. Odnosi się tylko do " +"Drukowania Drutu." msgctxt "wireframe_flat_delay label" msgid "WP Flat Delay" -msgstr "Opóźnienie w drukowaniu z poziomej konstrukcji z drutu" +msgstr "DD Płaskie Opóźnienie" msgctxt "wireframe_flow description" msgid "" "Flow compensation: the amount of material extruded is multiplied by this " "value. Only applies to Wire Printing." msgstr "" -"Kompensacja przepływu: Wytłaczany ilość materiału jest mnożone przez tę " -"wartość. Odnosi się tylko do drukowania ze strukturą drucianą." +"Kompensacja przepływu: ilość wytłaczanego materiału jest mnożona przez tę " +"wartość. Odnosi się tylko do Drukowania Drutu. " msgctxt "wireframe_flow label" msgid "WP Flow" -msgstr "Płynąć do druku struktury drutu" +msgstr "DD Przepływ" msgctxt "wireframe_flow_connection description" msgid "Flow compensation when going up or down. Only applies to Wire Printing." msgstr "" -"Kompensacja przepływu w górę iw dół. Odnosi się tylko do drukowania ze " -"strukturą drucianą." +"Kompensacja przepływu w górę i w dół. Odnosi się tylko do Drukowania Drutu." msgctxt "wireframe_flow_connection label" msgid "WP Connection Flow" -msgstr "Płynąć do połączeń Drukowanie za pomocą konstrukcji z drutu" +msgstr "DD Przepływ Połączenia" msgctxt "wireframe_flow_flat description" msgid "" "Flow compensation when printing flat lines. Only applies to Wire Printing." msgstr "" "Kompensacja przepływu podczas drukowania płaskich linii. Dotyczy tylko " -"Drukowania drutu." +"Drukowania Drutu." msgctxt "wireframe_flow_flat label" msgid "WP Flat Flow" -msgstr "Przepływ do druku płaskiego linii ze struktury z drutu" +msgstr "DD Płaskie Przepływ" msgctxt "wireframe_height description" msgid "" @@ -4630,13 +4595,13 @@ msgid "" "horizontal parts. This determines the overall density of the net structure. " "Only applies to Wire Printing." msgstr "" -"Wysokość w górę i po przekątnej linii między dwiema częściami poziomymi. " -"Określa ona całkowitą gęstość struktury netto. Dotyczy tylko Drukowania " -"drutu." +"Wysokość linii w górę i po przekątnej w dół między dwiema częściami " +"poziomymi. Określa ona całkowitą gęstość struktury siatki. Dotyczy tylko " +"Drukowania Drutu." msgctxt "wireframe_height label" msgid "WP Connection Height" -msgstr "Wysokość przyłącza przy drukowaniu o strukturze drucianej" +msgstr "DD Wysokość Połączenia" msgctxt "wireframe_nozzle_clearance description" msgid "" @@ -4646,25 +4611,25 @@ msgid "" "applies to Wire Printing." msgstr "" "Odległość między dyszą a liniami skierowanymi w dół. Większe prześwity " -"powodują ukośne skierowanie w dół linii o mniej stromym kącie, co z kolei " +"powodują ukośne linie skierowanie w dół o mniej stromym kącie, co z kolei " "skutkuje mniejszymi połączeniami z następną warstwą. Dotyczy tylko " -"Drukowania drutu." +"Drukowania Drutu." msgctxt "wireframe_nozzle_clearance label" msgid "WP Nozzle Clearance" -msgstr "Rozdzielacze dysz WP" +msgstr "DD Prześwit Dyszy" msgctxt "wireframe_printspeed description" msgid "" "Speed at which the nozzle moves when extruding material. Only applies to " "Wire Printing." msgstr "" -"Prędkość, w której dysze przemieszczają się podczas wytłaczania materiału. " -"Dotyczy tylko Drukowania drutu." +"Prędkość, z jaką porusza się dysza podczas wytłaczania materiału. Dotyczy " +"tylko Drukowania Drutu." msgctxt "wireframe_printspeed label" msgid "WP Speed" -msgstr "Prędkość przy drukowaniu ze strukturą drucianą" +msgstr "DD Prędkość" msgctxt "wireframe_printspeed_bottom description" msgid "" @@ -4672,45 +4637,45 @@ msgid "" "build platform. Only applies to Wire Printing." msgstr "" "Prędkość drukowania pierwszej warstwy, która jest jedyną warstwą dotykającą " -"platformy build. Dotyczy tylko Drukowania drutu." +"stołu. Dotyczy tylko Drukowania Drutu." msgctxt "wireframe_printspeed_bottom label" msgid "WP Bottom Printing Speed" -msgstr "Prędkość druku w dolnej części strony" +msgstr "WP Prędk. Drukowania Dołu" msgctxt "wireframe_printspeed_down description" msgid "" "Speed of printing a line diagonally downward. Only applies to Wire Printing." msgstr "" -"Prędkość przy drukowaniu linii ukośnie ku dołowi. Odnosi się tylko do " -"drukowania ze strukturą drucianą." +"Prędkość drukowania ukośnej linii w dół. Odnosi się tylko do Drukowania " +"Drutu." msgctxt "wireframe_printspeed_down label" msgid "WP Downward Printing Speed" -msgstr "Prędkość podczas drukowania w dół ze strukturą drucianą" +msgstr "DD Prędkość Drukowania w Dół" msgctxt "wireframe_printspeed_flat description" msgid "" "Speed of printing the horizontal contours of the model. Only applies to Wire " "Printing." msgstr "" -"Prędkość podczas drukowania poziome konturów modelu. Odnosi się tylko do " -"drukowania ze strukturą drucianą." +"Prędkość drukowania poziomych konturów modelu. Odnosi się tylko do " +"Drukowania Drutu." msgctxt "wireframe_printspeed_flat label" msgid "WP Horizontal Printing Speed" -msgstr "Prędkość drukowania poziomego WP" +msgstr "DD Prędkość Drukowania Poziomo" msgctxt "wireframe_printspeed_up description" msgid "" "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." msgstr "" -"Szybkość drukowania linii „pływający” w kierunku do góry. Odnosi się tylko " -"do drukowania ze strukturą drucianą." +"Szybkość drukowania linii do góry „w powietrzu”. Odnosi się tylko do " +"Drukowania Drutu." msgctxt "wireframe_printspeed_up label" msgid "WP Upward Printing Speed" -msgstr "Prędkość podczas drukowania w kierunku do góry ze strukturą drucianą" +msgstr "DD Prędkość Drukowania do Góry" msgctxt "wireframe_roof_drag_along description" msgid "" @@ -4718,13 +4683,13 @@ msgid "" "when going back to the outer outline of the roof. This distance is " "compensated for. Only applies to Wire Printing." msgstr "" -"Odległość od końcówki rozciągającego się do wewnątrz wokół linii którym jest " -"zaciśnięte na powrót do zewnętrznej linii obwodowej dachu. Trasa ta jest " -"kompensowana. Odnosi się tylko do drukowania ze strukturą drucianą." +"Długość końcówki wewnętrznej linii, która jest rozciągana podczas powrotu do " +"zewnętrznej linii dachu. Trasa ta jest kompensowana. Odnosi się tylko do " +"Drukowania Drutu." msgctxt "wireframe_roof_drag_along label" msgid "WP Roof Drag Along" -msgstr "Dokręcić dach podczas drukowania ze strukturą drucianą" +msgstr "DD Rozciągaj Dach" msgctxt "wireframe_roof_fall_down description" msgid "" @@ -4732,24 +4697,24 @@ msgid "" "when being printed. This distance is compensated for. Only applies to Wire " "Printing." msgstr "" -"Odległość, na jaką drukowane są poziome linie dachu \"w cienkim powietrzu\". " -"Ta odległość jest kompensowana. Dotyczy tylko Drukowania drutu." +"Odległość, na jaką opadają linie dachu wydrukowane \"w powietrzu\" podczas " +"druku. Ta odległość jest kompensowana. Dotyczy tylko Drukowania Drutu." msgctxt "wireframe_roof_fall_down label" msgid "WP Roof Fall Down" -msgstr "Spada z dachu podczas drukowania ze strukturą drucianą" +msgstr "DD Spadek Dachu" msgctxt "wireframe_roof_inset description" msgid "" "The distance covered when making a connection from a roof outline inward. " "Only applies to Wire Printing." msgstr "" -"Zadaszony odległość podczas nawiązywania połączenia z konturem dachu do " -"środka. Odnosi się tylko do drukowania ze strukturą drucianą." +"Odległość jaka zostaje pokryta podczas tworzenia połączenia z wewnętrznego " +"konturu dachu. Odnosi się tylko do Drukowania Drutu." msgctxt "wireframe_roof_inset label" msgid "WP Roof Inset Distance" -msgstr "Odległość wstawka na dachu przy drukowaniu ze strukturą drucianą" +msgstr "DD Długość Wkładu Dachu" msgctxt "wireframe_roof_outer_delay description" msgid "" @@ -4757,12 +4722,12 @@ msgid "" "times can ensure a better connection. Only applies to Wire Printing." msgstr "" "Czas, który poświęca się na zewnętrznych obrzeżach otworu, który ma stać się " -"dach później. połączenie może być lepiej z dłuższymi czasami. Odnosi się " -"tylko do drukowania ze strukturą drucianą." +"dachem. Dłuższy czas może spowodować lepsze połączenie. Odnosi się tylko do " +"Drukowania Drutu." msgctxt "wireframe_roof_outer_delay label" msgid "WP Roof Outer Delay" -msgstr "Opóźnienia dla obwodów dachowych przy drukowaniu ze strukturą drucianą" +msgstr "DD Opóźnienie Zewn. Dachu" msgctxt "wireframe_straight_before_down description" msgid "" @@ -4770,13 +4735,13 @@ msgid "" "line piece. This can prevent sagging of the top most point of upward lines. " "Only applies to Wire Printing." msgstr "" -"Odsetek linii przekątnej w dół, która jest przykryta poziomą linią. Może to " -"uniemożliwić zwielokrotnienie górnej krawędzi w górę. Dotyczy tylko " -"Drukowania drutu." +"Odsetek ukośnych linii ułożonych w dół, który jest przykryty poziomą linią. " +"Może to uniemożliwić zwisanie górnej krawędzi linii ułożonejw górę. Dotyczy " +"tylko Drukowania Drutu." msgctxt "wireframe_straight_before_down label" msgid "WP Straighten Downward Lines" -msgstr "WP Prostuj linie w dół" +msgstr "DD Prostuj Linie w Dół" msgctxt "wireframe_strategy description" msgid "" @@ -4789,20 +4754,20 @@ msgid "" "won't always fall down as predicted." msgstr "" "Strategia zapewniająca podłączenie dwóch kolejnych warstw w każdym punkcie " -"połączenia. Odsunięcie pozwala na utwardzenie w górę pozycji we właściwej " -"pozycji, ale może powodować mielenie filamentów. Sieć węzła może być " -"wykonana na końcu linii do góry, aby zwiększyć szanse na połączenie z nią i " -"pozostawić linię chłodną; Może to jednak wymagać szybkich prędkości druku. " -"Inną strategią jest wyrównanie opadania górnej krawędzi w górę; Jednak linie " -"nie zawsze spadają zgodnie z przewidywaniami." +"połączenia. Wycofanie pozwala na utwardzenie linii idących w górę we " +"właściwej pozycji, ale może powodować \"mielenie\" filamentu. Węzeł może być " +"wykonany na końcu linii do góry, aby zwiększyć szanse na połączenie z nią i " +"pozostawić dobrą linię; może to jednak wymagać wolnych prędkości druku. Inną " +"strategią jest wyrównanie opadania górnej krawędzi. Jednak linie nie zawsze " +"spadają zgodnie z przewidywaniami." msgctxt "wireframe_strategy label" msgid "WP Strategy" -msgstr "Strategia dla konstrukcji z drutu drukowanie" +msgstr "DD Strategia" msgctxt "wireframe_strategy option compensate" msgid "Compensate" -msgstr "Kompensować" +msgstr "Kompensuj" msgctxt "wireframe_strategy option knot" msgid "Knot" @@ -4817,12 +4782,12 @@ msgid "" "Delay time after an upward move, so that the upward line can harden. Only " "applies to Wire Printing." msgstr "" -"Opóżnienie czasu po wzniesieniu w górę, tak aby linia w górę mogła się " -"zesztywniać. Dotyczy tylko Drukowania drutu." +"Opóźnienie czasu po wzniesieniu w górę, tak aby linia idąca w górę mogła " +"zesztywniać. Dotyczy tylko Drukowania Drutu." msgctxt "wireframe_top_delay label" msgid "WP Top Delay" -msgstr "Up opóźnienia w drukowaniu ze strukturą drucianą" +msgstr "DD Opóźnienie Góry" msgctxt "wireframe_top_jump description" msgid "" @@ -4831,11 +4796,11 @@ msgid "" "Printing." msgstr "" "Tworzy mały węzeł u góry linii w górę, dzięki czemu kolejna pozioma warstwa " -"ma większą szansę połączenia się z nią. Dotyczy tylko Drukowania drutu." +"ma większą szansę połączenia się z nią. Dotyczy tylko Drukowania Drutu." msgctxt "wireframe_top_jump label" msgid "WP Knot Size" -msgstr "Rozmiar węzła do druku struktury drutu" +msgstr "DD Rozmiar Węzła" msgctxt "wireframe_up_half_speed description" msgid "" @@ -4843,15 +4808,15 @@ msgid "" "This can cause better adhesion to previous layers, while not heating the " "material in those layers too much. Only applies to Wire Printing." msgstr "" -"Dystans przemieszczania się ku górze, która jest wytłaczana z połową " +"Dystans przemieszczania się ku górze, który jest wytłaczany z połową " "szybkości.\n" -"Może to prowadzić do lepszej przyczepności do wcześniejszych warstwach, a " -"przegrzanie materiału unika się w tych warstwach. Odnosi się tylko do " -"drukowania ze strukturą drucianą." +"Może to prowadzić do lepszej przyczepności do wcześniejszych warstw, bez " +"zbytniego podgrzewania materiału na tych warstwach. Odnosi się tylko do " +"Drukowania Drutu." msgctxt "wireframe_up_half_speed label" msgid "WP Ease Upward" -msgstr "Przy drukowaniu o strukturze drucianej powolny ruch ku górze" +msgstr "DD Łatwe Wzniesienie" msgctxt "xy_offset description" msgid "" @@ -4859,13 +4824,13 @@ msgid "" "compensate for too big holes; negative values can compensate for too small " "holes." msgstr "" -"Wysokość przesunięcia zastosowana do wszystkich wieloboków w każdej " -"warstwie. Pozytywne wartości mogą kompensować zbyt duże otwory; Wartości " +"Wartość przesunięcia zastosowana do wszystkich wielokątów na każdej " +"warstwie. Dodatnie wartości mogą kompensować zbyt duże otwory; wartości " "ujemne mogą kompensować zbyt małe otwory." msgctxt "xy_offset label" msgid "Horizontal Expansion" -msgstr "Rozszerzenie poziome" +msgstr "Poziome Poszerzenie" msgctxt "z_seam_type description" msgid "" @@ -4880,23 +4845,23 @@ msgstr "" "pionowy szew. Wyrównywanie ich w pobliżu określonej przez użytkownika " "lokalizacji powoduje, że szew jest najprostszy do usunięcia. Po umieszczeniu " "losowo niedokładności na początku ścieżki będzie mniej zauważalny. Podczas " -"najkrótszej drogi wydruk będzie szybszy." +"najkrótszej ścieżki wydruk będzie szybszy." msgctxt "z_seam_type label" msgid "Z Seam Alignment" -msgstr "Wyrównanie szwu Z" +msgstr "Wyrównanie Szwu Z" msgctxt "z_seam_type option back" msgid "User Specified" -msgstr "Użytkownik został określony" +msgstr "Określone przez Użytkownika" msgctxt "z_seam_type option random" msgid "Random" -msgstr "Losowa" +msgstr "Losowe" msgctxt "z_seam_type option shortest" msgid "Shortest" -msgstr "Najkrótsza" +msgstr "Najkrótsze" msgctxt "z_seam_x description" msgid "" @@ -4904,11 +4869,11 @@ msgid "" "layer." msgstr "" "Współrzędna X położenia, w pobliżu miejsca rozpoczęcia drukowania każdej " -"części w warstwie." +"warstwy." msgctxt "z_seam_x label" msgid "Z Seam X" -msgstr "Z-X szew" +msgstr "Szew X" msgctxt "z_seam_y description" msgid "" @@ -4916,8 +4881,8 @@ msgid "" "layer." msgstr "" "Współrzędna Y położenia, w pobliżu miejsca rozpoczęcia drukowania każdej " -"części w warstwie." +"warstwy." msgctxt "z_seam_y label" msgid "Z Seam Y" -msgstr "Z-Y szew" +msgstr "Szew Y" From f2326f33de114d3e58d69abe5073a5c879a50dee Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 09:05:55 +0200 Subject: [PATCH 359/379] Correct metadata Including credits and such. --- resources/i18n/pl/cura.po | 22 ++++++++++++---------- resources/i18n/pl/fdmextruder.def.json.po | 19 +++++++++++++------ resources/i18n/pl/fdmprinter.def.json.po | 15 ++++++++++----- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index de790d3348..ad615743a9 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -1,17 +1,19 @@ -# English translations for PACKAGE package. -# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Automatically generated, 2017. +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. # msgid "" msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" +"Project-Id-Version: Cura 2.6\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0200\n" -"PO-Revision-Date: 2017-07-19 12:47+0200\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: pl_PL\n" +"PO-Revision-Date: 2017-07-26 6:39+0200\n" +"Last-Translator: jagus85 and anraf1001\n" +"Language-Team: reprapy.pl\n" +"Language: Polish\n" +"Lang-Code: pl\n" +"Country-Code: PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/resources/i18n/pl/fdmextruder.def.json.po b/resources/i18n/pl/fdmextruder.def.json.po index ead3e37bec..a3780f2a65 100644 --- a/resources/i18n/pl/fdmextruder.def.json.po +++ b/resources/i18n/pl/fdmextruder.def.json.po @@ -1,12 +1,19 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# msgid "" msgstr "" -"Project-Id-Version: Cura\n" -"Report-Msgid-Bugs-To: http://github.com/Ultimaker/Cura\n" -"POT-Creation-Date: 2017-03-27 17:27+0000\n" +"Project-Id-Version: Cura 2.6\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-05-30 15:32+0000\n" "PO-Revision-Date: 2017-07-20 16:49+0200\n" -"Last-Translator: Automatically generated\n" -"Language-Team: Polish\n" -"Language: pl_PL\n" +"Last-Translator: jagus85 and anraf1001\n" +"Language-Team: reprapy.pl\n" +"Language: Polish\n" +"Lang-Code: pl\n" +"Country-Code: PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index 2b503432bb..34f73738b2 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -1,14 +1,19 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# msgid "" msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" "PO-Revision-Date: 2017-07-24 11:51+0200\n" -"Last-Translator: Bothof \n" -"Language-Team: Polish\n" -"Language: pl_PL\n" -"Lang-Code: de\n" -"Country-Code: DE\n" +"Last-Translator: jagus85 and anraf1001\n" +"Language-Team: reprapy.pl\n" +"Language: Polish\n" +"Lang-Code: pl\n" +"Country-Code: PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" From e81eb87d252ee9ff2c1079ba7afda485bc6254ff Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 10:19:36 +0200 Subject: [PATCH 360/379] Consistency fixes Mostly grammar. --- resources/i18n/pl/cura.po | 68 ++++++++++++------------ resources/i18n/pl/fdmprinter.def.json.po | 2 +- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index ad615743a9..87a20c20e5 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -43,7 +43,7 @@ msgstr "Widok rentgenowski" #: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:15 msgctxt "@info:whatsthis" msgid "Provides the X-Ray view." -msgstr "Zapewnia widok rentgenowski " +msgstr "Zapewnia widok rentgenowski." #: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:19 msgctxt "@item:inlistbox" @@ -58,7 +58,7 @@ msgstr "Czytnik X3D" #: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:14 msgctxt "@info:whatsthis" msgid "Provides support for reading X3D files." -msgstr "Zapewnia obsługę czytania plików X3D" +msgstr "Zapewnia obsługę czytania plików X3D." #: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:20 msgctxt "@item:inlistbox" @@ -73,12 +73,12 @@ msgstr "GCode Autor" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:15 msgctxt "@info:whatsthis" msgid "Writes GCode to a file." -msgstr "Zapisuje kod GCode do pliku" +msgstr "Zapisuje kod GCode do pliku." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:22 msgctxt "@item:inlistbox" msgid "GCode File" -msgstr "Plik GCode " +msgstr "Plik GCode" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:13 msgctxt "@label" @@ -103,7 +103,7 @@ msgstr "Drukuj z Doodle3D" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:38 msgctxt "@info:tooltip" msgid "Print with " -msgstr "Drukuj z" +msgstr "Drukuj z " #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:49 msgctxt "@title:menu" @@ -215,7 +215,7 @@ msgstr "Zapisuje do pliku X3G" #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:22 msgctxt "X3G Writer File Description" msgid "X3G File" -msgstr "Plik X3G " +msgstr "Plik X3G" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -426,7 +426,7 @@ msgstr "Różne materiały (Cura: {0}, Drukarka: {1}) wybrane do dzyszy {2}" #, python-brace-format msgctxt "@label" msgid "Print core {0} is not properly calibrated. XY calibration needs to be performed on the printer." -msgstr "Print core {0} nie jest poprawnie skalibrowany. Na drukarce powinna zostać przeprowadzona Kalibracja XY" +msgstr "Print core {0} nie jest poprawnie skalibrowany. Na drukarce powinna zostać przeprowadzona Kalibracja XY." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:697 msgctxt "@label" @@ -590,7 +590,7 @@ msgstr "Zapewnia obsługę importowania profili z plików g-code." #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:21 msgctxt "@item:inlistbox" msgid "G-code File" -msgstr "Pliki G-code " +msgstr "Pliki G-code" #: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 msgctxt "@label" @@ -665,17 +665,17 @@ msgstr "Obraz JPEG" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:29 msgctxt "@item:inlistbox" msgid "PNG Image" -msgstr "Obraz PNG " +msgstr "Obraz PNG" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:33 msgctxt "@item:inlistbox" msgid "BMP Image" -msgstr "Obraz BMP " +msgstr "Obraz BMP" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:37 msgctxt "@item:inlistbox" msgid "GIF Image" -msgstr "Obraz GIF " +msgstr "Obraz GIF" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:272 #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:105 @@ -761,7 +761,7 @@ msgstr "Zapewnia obsługę czytania plików 3MF." #: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:44 msgctxt "@item:inlistbox" msgid "3MF File" -msgstr "Plik 3MF " +msgstr "Plik 3MF" #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:119 #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1047 @@ -792,7 +792,7 @@ msgstr "Czytnik G-code" #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:15 msgctxt "@info:whatsthis" msgid "Allows loading and displaying G-code files." -msgstr "Umożliwia ładowanie i wyświetlanie plików G-code" +msgstr "Umożliwia ładowanie i wyświetlanie plików G-code." #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:25 msgctxt "@item:inlistbox" @@ -802,7 +802,7 @@ msgstr "Plik G-code" #: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 msgctxt "@info:status" msgid "Parsing G-code" -msgstr "Analizowanie G-code" +msgstr "Analizowanie G-code" #: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:365 msgctxt "@info:generic" @@ -841,7 +841,7 @@ msgstr "Zapewnia obsługę pisania plików 3MF." #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:31 msgctxt "@item:inlistbox" msgid "3MF file" -msgstr "Plik 3MF " +msgstr "Plik 3MF" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:39 msgctxt "@item:inlistbox" @@ -1046,7 +1046,7 @@ msgstr "Ładowanie interfejsu ..." #, python-format msgctxt "@info" msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(szerokość).1f x %(głębokość).1f x %(wysokość).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1263 #, python-brace-format @@ -1167,7 +1167,7 @@ msgstr "Średnica filamentu" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:540 msgctxt "@label" msgid "Nozzle size" -msgstr "Rozmiar dyszy:" +msgstr "Rozmiar dyszy" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:417 msgctxt "@label" @@ -1207,7 +1207,7 @@ msgstr "Końcowy Gcode ekstrudera" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:20 msgctxt "@title:window" msgid "Doodle3D Settings" -msgstr "Ustawienia Doodle3D " +msgstr "Ustawienia Doodle3D" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:53 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 @@ -1265,7 +1265,7 @@ msgstr "Aktualizacja oprogramowania układowego" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:40 msgctxt "@label" msgid "Firmware update completed." -msgstr "Aktualizacja oprogramowania zakończona" +msgstr "Aktualizacja oprogramowania zakończona." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:45 msgctxt "@label" @@ -1531,7 +1531,7 @@ msgstr "Wysokość podstawy od stołu w milimetrach." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 msgctxt "@action:label" msgid "Base (mm)" -msgstr "Baza(mm)" +msgstr "Baza (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 msgctxt "@info:tooltip" @@ -1541,12 +1541,12 @@ msgstr "Szerokość w milimetrach na stole." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 msgctxt "@action:label" msgid "Width (mm)" -msgstr "Szerokość(mm)" +msgstr "Szerokość (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" msgid "The depth in millimeters on the build plate" -msgstr "Głębokość w milimetrach na stole " +msgstr "Głębokość w milimetrach na stole" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 msgctxt "@action:label" @@ -1830,7 +1830,7 @@ msgstr "Rozpocznij sprawdzanie drukarki" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 msgctxt "@label" msgid "Connection: " -msgstr "Połączenie:" +msgstr "Połączenie: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" @@ -1876,7 +1876,7 @@ msgstr "Krańcówka min. Z: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 msgctxt "@label" msgid "Nozzle temperature check: " -msgstr "Sprawdzanie temperatury dyszy:" +msgstr "Sprawdzanie temperatury dyszy: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 @@ -2325,7 +2325,7 @@ msgstr "Domyślne zachowanie podczas otwierania pliku projektu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491 msgctxt "@window:text" msgid "Default behavior when opening a project file: " -msgstr "Domyślne zachowanie podczas otwierania pliku projektu:" +msgstr "Domyślne zachowanie podczas otwierania pliku projektu: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:504 msgctxt "@option:openProject" @@ -2622,12 +2622,12 @@ msgstr "Wypełnienie" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:183 msgctxt "@tooltip" msgid "Support Infill" -msgstr "Wypełnienie podpór " +msgstr "Wypełnienie podpór" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:184 msgctxt "@tooltip" msgid "Support Interface" -msgstr "Łączenie podpory " +msgstr "Łączenie podpory" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:185 msgctxt "@tooltip" @@ -2696,7 +2696,7 @@ msgstr "Struktura aplikacji" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 msgctxt "@label" msgid "GCode generator" -msgstr "Generator GCode " +msgstr "Generator GCode" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 msgctxt "@label" @@ -2712,7 +2712,7 @@ msgstr "Język programowania" #, fuzzy msgctxt "@label" msgid "GUI framework" -msgstr "Framework GUI " +msgstr "Framework GUI" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 #, fuzzy @@ -2734,7 +2734,7 @@ msgstr "Format wymiany danych" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 msgctxt "@label" msgid "Support library for scientific computing " -msgstr "Wsparcie biblioteki dla obliczeń naukowych" +msgstr "Wsparcie biblioteki dla obliczeń naukowych " #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 msgctxt "@label" @@ -3048,17 +3048,17 @@ msgstr "Konfiguruj Cura..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." -msgstr "&Dodaj drukarkę ..." +msgstr "&Dodaj drukarkę..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." -msgstr "Zarządzaj drukarkami ..." +msgstr "Zarządzaj drukarkami..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 msgctxt "@action:inmenu" msgid "Manage Materials..." -msgstr "Zarządzaj materiałami ..." +msgstr "Zarządzaj materiałami..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 msgctxt "@action:inmenu menubar:profile" @@ -3184,7 +3184,7 @@ msgstr "Zresetuj wszystkie przekształcenia modelu" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." -msgstr "&Otwórz plik(i) ..." +msgstr "&Otwórz plik(i)..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 msgctxt "@action:inmenu menubar:file" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index 34f73738b2..4b08303dd3 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -1771,7 +1771,7 @@ msgstr "Początk. G-code" msgctxt "machine_use_extruder_offset_to_offset_coords description" msgid "Apply the extruder offset to the coordinate system." -msgstr "Zastosuj przesunięcie głowicy względem ." +msgstr "Zastosuj przesunięcie głowicy względem." msgctxt "machine_use_extruder_offset_to_offset_coords label" msgid "Offset With Extruder" From 52bf6245c1e050fb4239999c65993c037642bbef Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 11:32:48 +0200 Subject: [PATCH 361/379] Remove superfluous fuzzy markers These seem to be translated fine. I think the translators just forgot to remove these. There are some other fuzzy markers that are still properly marked because they need to be looked at. --- resources/i18n/pl/cura.po | 5 ----- 1 file changed, 5 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index 87a20c20e5..071c4ec32d 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -277,7 +277,6 @@ msgid "Failed to eject {0}. Another program may be using the drive." msgstr "Nie można wysunąć {0}. Inny program może używać dysku." #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/__init__.py:12 -#, fuzzy msgctxt "@label" msgid "Removable Drive Output Device Plugin" msgstr "Usuwana wtyczka urządzenia wyjściowego napędu" @@ -516,7 +515,6 @@ msgid "Post Processing" msgstr "Przetwarzanie " #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16 -#, fuzzy msgctxt "Description of plugin" msgid "Extension that allows for user created scripts for post processing" msgstr "Rozszerzenie, które pozwala tworzyć skrypty dla użytkowników po przetworzeniu" @@ -810,7 +808,6 @@ msgid "Make sure the g-code is suitable for your printer and printer configurati msgstr "Przed wysłaniem pliku upewnij się, że G-code jest odpowiedni do konfiguracji drukarki. Przedstawienie G-kodu może nie być dokładne." #: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:12 -#, fuzzy msgctxt "@label" msgid "Cura Profile Writer" msgstr "Pisarz Profili Cura" @@ -833,7 +830,6 @@ msgid "3MF Writer" msgstr "3MF Writer" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:22 -#, fuzzy msgctxt "@info:whatsthis" msgid "Provides support for writing 3MF files." msgstr "Zapewnia obsługę pisania plików 3MF." @@ -2709,7 +2705,6 @@ msgid "Programming language" msgstr "Język programowania" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 -#, fuzzy msgctxt "@label" msgid "GUI framework" msgstr "Framework GUI" From b08c4cd1dc31d9d3067d72a11e2142d5092d0353 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 12:39:43 +0200 Subject: [PATCH 362/379] Update PVA Verydraft support layer thickness Apparently 0.6mm layers produced edges that were being pulled along with the nozzle. 0.3mm it is then. --- .../quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg index 4891dc64ab..e816446f6d 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg @@ -13,5 +13,5 @@ setting_version = 2 [values] layer_height = 0.3 material_standby_temperature = 100 -support_infill_sparse_thickness = 0.6 +support_infill_sparse_thickness = 0.3 support_interface_height = 1.2 \ No newline at end of file From 93731b8d1fde532816709f3ea15b5dd19dd8c247 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 26 Jul 2017 14:00:02 +0200 Subject: [PATCH 363/379] Trigger auto-slice based on stackValidation instead of stack/setting changes CURA-4084 Stack error checks are scheduled with a delay, and when a container is changed (e.g. Quality), the auto-slice may get triggered before the error check is done. Because the error check result is cached, the auto-slicing will use the previous result instead of new. So, the auto-slicing should be triggered when a stack validation is finished instead of when a stack/setting gets changed. --- cura/Settings/MachineManager.py | 2 + .../CuraEngineBackend/CuraEngineBackend.py | 65 +++---------------- 2 files changed, 11 insertions(+), 56 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6499e527f5..e15784b123 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -115,6 +115,7 @@ class MachineManager(QObject): activeStackValueChanged = pyqtSignal() # Emitted whenever a value inside the active stack is changed. activeStackValidationChanged = pyqtSignal() # Emitted whenever a validation inside active container is changed stacksValidationChanged = pyqtSignal() # Emitted whenever a validation is changed + stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly @@ -305,6 +306,7 @@ class MachineManager(QObject): self._stacks_have_errors = self._checkStacksHaveErrors() if old_stacks_have_errors != self._stacks_have_errors: self.stacksValidationChanged.emit() + self.stacksValidationFinished.emit() def _onActiveExtruderStackChanged(self): self.blurSettings.emit() # Ensure no-one has focus. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9c9c9a1b90..55db1c3c4b 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -76,14 +76,8 @@ class CuraEngineBackend(QObject, Backend): self._scene = Application.getInstance().getController().getScene() self._scene.sceneChanged.connect(self._onSceneChanged) - # Triggers for when to (re)start slicing: - self._global_container_stack = None - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - self._onGlobalStackChanged() - - self._active_extruder_stack = None - ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) - self._onActiveExtruderChanged() + # trigger auto-slicing on error check finished + Application.getInstance().getMachineManager().stacksValidationFinished.connect(self._onStackErrorCheckFinished) # Listeners for receiving messages from the back-end. self._message_handlers["cura.proto.Layer"] = self._onLayerMessage @@ -277,16 +271,17 @@ class CuraEngineBackend(QObject, Backend): return if job.getResult() == StartSliceJob.StartJobResult.SettingError: + global_container_stack = Application.getInstance().getGlobalContainerStack() if Application.getInstance().platformActivity: - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) error_keys = [] for extruder in extruders: error_keys.extend(extruder.getErrorKeys()) if not extruders: - error_keys = self._global_container_stack.getErrorKeys() + error_keys = global_container_stack.getErrorKeys() error_labels = set() for key in error_keys: - for stack in [self._global_container_stack] + extruders: #Search all container stacks for the definition of this setting. Some are only in an extruder stack. + for stack in [global_container_stack] + extruders: #Search all container stacks for the definition of this setting. Some are only in an extruder stack. definitions = stack.getBottom().findDefinitions(key = key) if definitions: break #Found it! No need to continue search. @@ -425,14 +420,9 @@ class CuraEngineBackend(QObject, Backend): # With manually having to slice, we want to clear the old invalid layer data. self._clearLayerData() - ## A setting has changed, so check if we must reslice. - # - # \param instance The setting instance that has changed. - # \param property The property of the setting instance that has changed. - def _onSettingChanged(self, instance, property): - if property == "value": # Only reslice if the value has changed. - self.needsSlicing() - self._onChanged() + def _onStackErrorCheckFinished(self): + self.needsSlicing() + self._onChanged() ## Called when a sliced layer data message is received from the engine. # @@ -585,43 +575,6 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) self._process = None - ## Called when the global container stack changes - def _onGlobalStackChanged(self): - if self._global_container_stack: - self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged) - self._global_container_stack.containersChanged.disconnect(self._onChanged) - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - if extruders: - for extruder in extruders: - extruder.propertyChanged.disconnect(self._onSettingChanged) - - self._global_container_stack = Application.getInstance().getGlobalContainerStack() - - if self._global_container_stack: - self._global_container_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. - self._global_container_stack.containersChanged.connect(self._onChanged) - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - if extruders: - for extruder in extruders: - extruder.propertyChanged.connect(self._onSettingChanged) - self._onActiveExtruderChanged() - self._onChanged() - - def _onActiveExtruderChanged(self): - if self._global_container_stack: - # Connect all extruders of the active machine. This might cause a few connects that have already happend, - # but that shouldn't cause issues as only new / unique connections are added. - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - if extruders: - for extruder in extruders: - extruder.propertyChanged.connect(self._onSettingChanged) - if self._active_extruder_stack: - self._active_extruder_stack.containersChanged.disconnect(self._onChanged) - - self._active_extruder_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if self._active_extruder_stack: - self._active_extruder_stack.containersChanged.connect(self._onChanged) - def _onProcessLayersFinished(self, job): self._process_layers_job = None From 9c1d23fe5b49adce45c1cc540bac44c708101f3b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 26 Jul 2017 14:07:51 +0200 Subject: [PATCH 364/379] Make sure MachineManager initializes after ContainerRegistry does CURA-4084 When MachineManager gets created, it will find and set the current active machine. This requires the ContainerRegistry to be initialized first. --- cura/CuraApplication.py | 6 ++++++ cura/Settings/MachineManager.py | 3 +-- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ab209e83cf..9ffd7010d9 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -119,6 +119,12 @@ class CuraApplication(QtApplication): Q_ENUMS(ResourceTypes) + # FIXME: This signal belongs to the MachineManager, but the CuraEngineBackend plugin requires on it. + # Because plugins are initialized before the ContainerRegistry, putting this signal in MachineManager + # will make it initialized before ContainerRegistry does, and it won't find the active machine, thus + # Cura will always show the Add Machine Dialog upon start. + stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished + def __init__(self): # this list of dir names will be used by UM to detect an old cura directory for dir_name in ["extruders", "machine_instances", "materials", "plugins", "quality", "user", "variants"]: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e15784b123..bbbf6b6e2e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -115,7 +115,6 @@ class MachineManager(QObject): activeStackValueChanged = pyqtSignal() # Emitted whenever a value inside the active stack is changed. activeStackValidationChanged = pyqtSignal() # Emitted whenever a validation inside active container is changed stacksValidationChanged = pyqtSignal() # Emitted whenever a validation is changed - stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly @@ -306,7 +305,7 @@ class MachineManager(QObject): self._stacks_have_errors = self._checkStacksHaveErrors() if old_stacks_have_errors != self._stacks_have_errors: self.stacksValidationChanged.emit() - self.stacksValidationFinished.emit() + Application.getInstance().stacksValidationFinished.emit() def _onActiveExtruderStackChanged(self): self.blurSettings.emit() # Ensure no-one has focus. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 55db1c3c4b..e1386e8749 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -77,7 +77,7 @@ class CuraEngineBackend(QObject, Backend): self._scene.sceneChanged.connect(self._onSceneChanged) # trigger auto-slicing on error check finished - Application.getInstance().getMachineManager().stacksValidationFinished.connect(self._onStackErrorCheckFinished) + Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) # Listeners for receiving messages from the back-end. self._message_handlers["cura.proto.Layer"] = self._onLayerMessage From a45ffad9bdfe54af3a9a402e678133aed8357fb0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 14:17:55 +0200 Subject: [PATCH 365/379] More small fixes to Polish translations I had checked the translations and pointed out a number of missing or inconsistent translations to the translators. This is the result in the end of that correspondence. --- resources/i18n/pl/cura.po | 16 +++++----------- resources/i18n/pl/fdmprinter.def.json.po | 4 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index 071c4ec32d..11969bd4b7 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -824,7 +824,6 @@ msgid "Cura Profile" msgstr "Profile Cura" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:19 -#, fuzzy msgctxt "@label" msgid "3MF Writer" msgstr "3MF Writer" @@ -2710,16 +2709,14 @@ msgid "GUI framework" msgstr "Framework GUI" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 -#, fuzzy msgctxt "@label" msgid "GUI framework bindings" -msgstr "GUI framework bindings" +msgstr "Powiązania Frameworka GUI" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 -#, fuzzy msgctxt "@label" msgid "C/C++ Binding library" -msgstr "C/C++ Binding library" +msgstr "Biblioteka Powiązań C/C++" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 msgctxt "@label" @@ -2752,16 +2749,14 @@ msgid "Serial communication library" msgstr "Biblioteka komunikacji szeregowej" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 -#, fuzzy msgctxt "@label" msgid "ZeroConf discovery library" -msgstr "ZeroConf discovery library" +msgstr "Bilbiotek poszukująca Zeroconf" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 -#, fuzzy msgctxt "@label" msgid "Polygon clipping library" -msgstr "Polygon clipping library" +msgstr "Biblioteka edytująca pola" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 msgctxt "@label" @@ -2830,10 +2825,9 @@ msgid "This setting is always shared between all extruders. Changing it here wil msgstr "To ustawienie jest zawsze dzielone między wszystkie ekstrudery. Zmiana jego wartości tutaj spowoduje zmianę dla wszystkich ekstruderów" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:158 -#, fuzzy msgctxt "@label" msgid "The value is resolved from per-extruder values " -msgstr "The value is resolved from per-extruder values " +msgstr "Wartość jest pobierana z osobna dla każdego ekstrudera " #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:184 msgctxt "@label" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index 4b08303dd3..5413d4c314 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -1762,8 +1762,8 @@ msgid "" "Gcode commands to be executed at the very start - separated by \n" "." msgstr "" -"Polecenia G-code, które są wykonywane na samym początku - oddzielone za " -"pomocą " +"Polecenia G-code, które są wykonywane na samym początku - oddzielone za pomocą \n" +"." msgctxt "machine_start_gcode label" msgid "Start GCode" From ffc5c2aa330b8e6c26434e17604dbe0af25a1056 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 14:23:58 +0200 Subject: [PATCH 366/379] Update credits of last-translator metadata These guys want to be credited with their full name as well as their nicknames, so let's give them the fame they deserve. The change log will be updated later. --- resources/i18n/pl/cura.po | 2 +- resources/i18n/pl/fdmextruder.def.json.po | 2 +- resources/i18n/pl/fdmprinter.def.json.po | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po index 11969bd4b7..c6140946f9 100644 --- a/resources/i18n/pl/cura.po +++ b/resources/i18n/pl/cura.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0200\n" "PO-Revision-Date: 2017-07-26 6:39+0200\n" -"Last-Translator: jagus85 and anraf1001\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" "Language: Polish\n" "Lang-Code: pl\n" diff --git a/resources/i18n/pl/fdmextruder.def.json.po b/resources/i18n/pl/fdmextruder.def.json.po index a3780f2a65..a18ab15ef8 100644 --- a/resources/i18n/pl/fdmextruder.def.json.po +++ b/resources/i18n/pl/fdmextruder.def.json.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" "PO-Revision-Date: 2017-07-20 16:49+0200\n" -"Last-Translator: jagus85 and anraf1001\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" "Language: Polish\n" "Lang-Code: pl\n" diff --git a/resources/i18n/pl/fdmprinter.def.json.po b/resources/i18n/pl/fdmprinter.def.json.po index 5413d4c314..2fd16b3424 100644 --- a/resources/i18n/pl/fdmprinter.def.json.po +++ b/resources/i18n/pl/fdmprinter.def.json.po @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" "PO-Revision-Date: 2017-07-24 11:51+0200\n" -"Last-Translator: jagus85 and anraf1001\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" "Language: Polish\n" "Lang-Code: pl\n" From 506a0a48f4e720ad2e2f90cf411707a6994b0679 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 26 Jul 2017 14:26:24 +0200 Subject: [PATCH 367/379] Reword: roofing -> top surface infill CURA-3940 --- resources/definitions/fdmprinter.def.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c5e4a8f98d..53a346f4d6 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -701,7 +701,7 @@ }, "roofing_line_width": { - "label": "Roofing Line Width", + "label": "Top Surface Infill Line Width", "description": "Width of a single line of the areas at the top of the print.", "unit": "mm", "minimum_value": "0.001", @@ -948,7 +948,7 @@ }, "roofing_extruder_nr": { - "label": "Roofing Extruder", + "label": "Top Surface Infill Extruder", "description": "The extruder train used for printing the top most skin. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", @@ -961,7 +961,7 @@ }, "roofing_layer_count": { - "label": "Roofing Layers", + "label": "Top Surface Infill Layers", "description": "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces.", "default_value": 0, "minimum_value": "0", @@ -974,7 +974,7 @@ }, "roofing_pattern": { - "label": "Roofing Pattern", + "label": "Top Surface Infill Pattern", "description": "The pattern of the top most layers.", "type": "enum", "options": @@ -991,8 +991,8 @@ }, "roofing_angles": { - "label": "Roofing Line Directions", - "description": "A list of integer line directions to use when the roofing layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", + "label": "Top Surface Infill Line Directions", + "description": "A list of integer line directions to use when the top surface infill layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", "type": "[int]", "default_value": "[ ]", "value": "skin_angles", From 686ca803ee2d577fc835c09ba7c2b2d091751ff5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 26 Jul 2017 15:06:50 +0200 Subject: [PATCH 368/379] Set correct machine name when creating a new machine from a project CURA-4074 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index e40a7c5479..278e3030ec 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -651,7 +651,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): stack.setMetaDataEntry("machine", global_stack_id_new) # Only machines need a new name, stacks may be non-unique - stack.setName(self._container_registry.uniqueName(stack.getName())) + stack.setName(global_stack_id_new) container_stacks_added.append(stack) self._container_registry.addContainer(stack) From bd63c6a58ab962130391748a700c103fdafb6dea Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jul 2017 15:47:51 +0200 Subject: [PATCH 369/379] Remove override of printing temperature from BB variant We'd like to use the material's printing temperature, pretty please. --- resources/variants/ultimaker3_bb04.inst.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index d0b3dad59f..b5698dea54 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -19,7 +19,6 @@ jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 -material_print_temperature = 215 raft_base_speed = 20 raft_interface_speed = 20 raft_speed = 25 From d9d39c41dfc04ec0081eb33045b2b4b1a7391ad7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 09:03:04 +0200 Subject: [PATCH 370/379] Fix auto-slicing upon value changes and error checks CURA-4092 - Keep the error check finished signal. - Restore the old way of triggering an auto-slicing which depends on a setting value change singal. - Add a mechanism to make sure that if there is an error check, the auto-slicing will only be triggered after the check finishes. --- .../CuraEngineBackend/CuraEngineBackend.py | 87 +++++++++++++++++-- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e1386e8749..935ec94054 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -76,9 +76,28 @@ class CuraEngineBackend(QObject, Backend): self._scene = Application.getInstance().getController().getScene() self._scene.sceneChanged.connect(self._onSceneChanged) - # trigger auto-slicing on error check finished + # Triggers for auto-slicing. Auto-slicing is triggered as follows: + # - auto-slicing is started with a timer + # - whenever there is a value change, we start the timer + # - sometimes an error check can get scheduled for a value change, in that case, we ONLY want to start the + # auto-slicing timer when that error check is finished + # If there is an error check, it will set the "_is_error_check_scheduled" flag, stop the auto-slicing timer, + # and only wait for the error check to be finished to start the auto-slicing timer again. + # + self._global_container_stack = None + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() + + self._active_extruder_stack = None + ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) + self._onActiveExtruderChanged() + Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) + # A flag indicating if an error check was scheduled + # If so, we will stop the auto-slice timer and start upon the error check + self._is_error_check_scheduled = False + # Listeners for receiving messages from the back-end. self._message_handlers["cura.proto.Layer"] = self._onLayerMessage self._message_handlers["cura.proto.LayerOptimized"] = self._onOptimizedLayerMessage @@ -271,17 +290,16 @@ class CuraEngineBackend(QObject, Backend): return if job.getResult() == StartSliceJob.StartJobResult.SettingError: - global_container_stack = Application.getInstance().getGlobalContainerStack() if Application.getInstance().platformActivity: - extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) + extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) error_keys = [] for extruder in extruders: error_keys.extend(extruder.getErrorKeys()) if not extruders: - error_keys = global_container_stack.getErrorKeys() + error_keys = self._global_container_stack.getErrorKeys() error_labels = set() for key in error_keys: - for stack in [global_container_stack] + extruders: #Search all container stacks for the definition of this setting. Some are only in an extruder stack. + for stack in [self._global_container_stack] + extruders: #Search all container stacks for the definition of this setting. Some are only in an extruder stack. definitions = stack.getBottom().findDefinitions(key = key) if definitions: break #Found it! No need to continue search. @@ -420,7 +438,21 @@ class CuraEngineBackend(QObject, Backend): # With manually having to slice, we want to clear the old invalid layer data. self._clearLayerData() + ## A setting has changed, so check if we must reslice. + # \param instance The setting instance that has changed. + # \param property The property of the setting instance that has changed. + def _onSettingChanged(self, instance, property): + if property == "value": # Only reslice if the value has changed. + self.needsSlicing() + self._onChanged() + + elif property == "validationState": + if self._use_timer: + self._is_error_check_scheduled = True + self._change_timer.stop() + def _onStackErrorCheckFinished(self): + self._is_error_check_scheduled = False self.needsSlicing() self._onChanged() @@ -515,7 +547,12 @@ class CuraEngineBackend(QObject, Backend): def _onChanged(self, *args, **kwargs): self.needsSlicing() if self._use_timer: - self._change_timer.start() + # if the error check is scheduled, wait for the error check finish signal to trigger auto-slice, + # otherwise business as usual + if self._is_error_check_scheduled: + self._change_timer.stop() + else: + self._change_timer.start() ## Called when the back-end connects to the front-end. def _onBackendConnected(self): @@ -574,6 +611,44 @@ class CuraEngineBackend(QObject, Backend): if self._process: Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) self._process = None + ## Called when the global container stack changes + + def _onGlobalStackChanged(self): + if self._global_container_stack: + self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged) + self._global_container_stack.containersChanged.disconnect(self._onChanged) + extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + + if extruders: + for extruder in extruders: + extruder.propertyChanged.disconnect(self._onSettingChanged) + + self._global_container_stack = Application.getInstance().getGlobalContainerStack() + + if self._global_container_stack: + self._global_container_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. + self._global_container_stack.containersChanged.connect(self._onChanged) + extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + if extruders: + for extruder in extruders: + extruder.propertyChanged.connect(self._onSettingChanged) + self._onActiveExtruderChanged() + self._onChanged() + + def _onActiveExtruderChanged(self): + if self._global_container_stack: + # Connect all extruders of the active machine. This might cause a few connects that have already happend, + # but that shouldn't cause issues as only new / unique connections are added. + extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + if extruders: + for extruder in extruders: + extruder.propertyChanged.connect(self._onSettingChanged) + if self._active_extruder_stack: + self._active_extruder_stack.containersChanged.disconnect(self._onChanged) + + self._active_extruder_stack = ExtruderManager.getInstance().getActiveExtruderStack() + if self._active_extruder_stack: + self._active_extruder_stack.containersChanged.connect(self._onChanged) def _onProcessLayersFinished(self, job): self._process_layers_job = None From 85635b3b837dca03ee5dbb6ee5ca13f6093afd31 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 09:34:16 +0200 Subject: [PATCH 371/379] Reword: Roofing -> Top Surface Infill CURA-3940 --- resources/definitions/fdmprinter.def.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index eab47ab1fc..9c73da127c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2079,8 +2079,8 @@ }, "speed_roofing": { - "label": "Roofing Speed", - "description": "The speed at which roofing layers are printed.", + "label": "Top Surface Infill Speed", + "description": "The speed at which top surface infill layers are printed.", "unit": "mm/s", "type": "float", "minimum_value": "0.1", @@ -2434,8 +2434,8 @@ }, "acceleration_roofing": { - "label": "Roofing Acceleration", - "description": "The acceleration with which roofing layers are printed.", + "label": "Top Surface Infill Acceleration", + "description": "The acceleration with which top surface infill layers are printed.", "unit": "mm/s²", "type": "float", "minimum_value": "0.1", @@ -2738,8 +2738,8 @@ }, "jerk_roofing": { - "label": "Roofing Jerk", - "description": "The maximum instantaneous velocity change with which roofing layers are printed.", + "label": "Top Surface Infill Jerk", + "description": "The maximum instantaneous velocity change with which top surface infill layers are printed.", "unit": "mm/s", "type": "float", "minimum_value": "0.1", From 9fca677d408fd6710a3a387060125bb6d47f6b1c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 09:50:14 +0200 Subject: [PATCH 372/379] Fix comment location CURA-4048 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 935ec94054..d87c97e3ff 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -611,8 +611,8 @@ class CuraEngineBackend(QObject, Backend): if self._process: Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) self._process = None - ## Called when the global container stack changes + ## Called when the global container stack changes def _onGlobalStackChanged(self): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged) From c16bfa8949034cf0405e96678d801fc0e4dd646c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 09:54:28 +0200 Subject: [PATCH 373/379] Remove unnecessary if checks CURA-4048 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index d87c97e3ff..1573d8fa58 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -619,9 +619,8 @@ class CuraEngineBackend(QObject, Backend): self._global_container_stack.containersChanged.disconnect(self._onChanged) extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - if extruders: - for extruder in extruders: - extruder.propertyChanged.disconnect(self._onSettingChanged) + for extruder in extruders: + extruder.propertyChanged.disconnect(self._onSettingChanged) self._global_container_stack = Application.getInstance().getGlobalContainerStack() @@ -629,9 +628,8 @@ class CuraEngineBackend(QObject, Backend): self._global_container_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. self._global_container_stack.containersChanged.connect(self._onChanged) extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - if extruders: - for extruder in extruders: - extruder.propertyChanged.connect(self._onSettingChanged) + for extruder in extruders: + extruder.propertyChanged.connect(self._onSettingChanged) self._onActiveExtruderChanged() self._onChanged() @@ -640,9 +638,8 @@ class CuraEngineBackend(QObject, Backend): # Connect all extruders of the active machine. This might cause a few connects that have already happend, # but that shouldn't cause issues as only new / unique connections are added. extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) - if extruders: - for extruder in extruders: - extruder.propertyChanged.connect(self._onSettingChanged) + for extruder in extruders: + extruder.propertyChanged.connect(self._onSettingChanged) if self._active_extruder_stack: self._active_extruder_stack.containersChanged.disconnect(self._onChanged) From 439f3e5029a69d366f9dbcd3c463b392b2c9c01d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 10:20:04 +0200 Subject: [PATCH 374/379] When an error check finishes, only trigger auto-slicing if needed CURA-4092 Many things can trigger an error check, but Cura should only auto-slice if the error check was scheduled due to a value change. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 1573d8fa58..98f8473225 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -453,8 +453,9 @@ class CuraEngineBackend(QObject, Backend): def _onStackErrorCheckFinished(self): self._is_error_check_scheduled = False - self.needsSlicing() - self._onChanged() + if self._need_slicing: + self.needsSlicing() + self._onChanged() ## Called when a sliced layer data message is received from the engine. # From 1c39c90494a664fafdfdd127ace578bd274b19eb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 12:36:32 +0200 Subject: [PATCH 375/379] Add SolidWorks plugin CURA-3823 --- plugins/CuraSolidWorksPlugin/CMakeLists.txt | 11 + .../CuraSolidWorksPlugin/CommonComReader.py | 200 ++++++ plugins/CuraSolidWorksPlugin/ConfigDialog.py | 38 + plugins/CuraSolidWorksPlugin/ConfigDialog.qml | 112 +++ plugins/CuraSolidWorksPlugin/ExportSTLUI.qml | 107 +++ plugins/CuraSolidWorksPlugin/LICENSE | 661 ++++++++++++++++++ .../SolidWorksConstants.py | 45 ++ .../CuraSolidWorksPlugin/SolidWorksReader.py | 231 ++++++ .../SolidWorksReaderUI.py | 95 +++ plugins/CuraSolidWorksPlugin/__init__.py | 58 ++ plugins/CuraSolidWorksPlugin/plugin.json | 8 + .../test_files/test.SLDASM | Bin 0 -> 37454 bytes .../test_files/test.SLDPRT | Bin 0 -> 108224 bytes 13 files changed, 1566 insertions(+) create mode 100644 plugins/CuraSolidWorksPlugin/CMakeLists.txt create mode 100644 plugins/CuraSolidWorksPlugin/CommonComReader.py create mode 100644 plugins/CuraSolidWorksPlugin/ConfigDialog.py create mode 100644 plugins/CuraSolidWorksPlugin/ConfigDialog.qml create mode 100644 plugins/CuraSolidWorksPlugin/ExportSTLUI.qml create mode 100644 plugins/CuraSolidWorksPlugin/LICENSE create mode 100644 plugins/CuraSolidWorksPlugin/SolidWorksConstants.py create mode 100644 plugins/CuraSolidWorksPlugin/SolidWorksReader.py create mode 100644 plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py create mode 100644 plugins/CuraSolidWorksPlugin/__init__.py create mode 100644 plugins/CuraSolidWorksPlugin/plugin.json create mode 100644 plugins/CuraSolidWorksPlugin/test_files/test.SLDASM create mode 100644 plugins/CuraSolidWorksPlugin/test_files/test.SLDPRT diff --git a/plugins/CuraSolidWorksPlugin/CMakeLists.txt b/plugins/CuraSolidWorksPlugin/CMakeLists.txt new file mode 100644 index 0000000000..b4d7f32b73 --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/CMakeLists.txt @@ -0,0 +1,11 @@ +project(CuraSolidWorksIntegrationPlugin NONE) +cmake_minimum_required(VERSION 2.8.12) + +install(FILES + __init__.py + CommonComReader.py + SolidWorksConstants.py + SolidWorksReader.py + LICENSE + DESTINATION lib/cura/plugins/CuraSolidWorksIntegrationPlugin +) \ No newline at end of file diff --git a/plugins/CuraSolidWorksPlugin/CommonComReader.py b/plugins/CuraSolidWorksPlugin/CommonComReader.py new file mode 100644 index 0000000000..02665224a5 --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/CommonComReader.py @@ -0,0 +1,200 @@ +# Copyright (c) 2017 Thomas Karl Pietrowski + +# Buildins +import os +import tempfile + +# Uranium/Cura +from UM.Application import Application +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("CuraSolidWorksIntegrationPlugin") +from UM.Message import Message +from UM.Logger import Logger +from UM.Mesh.MeshReader import MeshReader +from UM.PluginRegistry import PluginRegistry +from UM.Scene.SceneNode import SceneNode + +# PyWin32 +from comtypes.client import GetClassObject + + +class CommonCOMReader(MeshReader): + def __init__(self, app_name, app_friendly_name): + super().__init__() + self._app_name = app_name + self._app_friendly_name = app_friendly_name + + # Start/stop behaviour + + # Technically neither preloading nor keeping the instance up, is possible, since Cura calls the file reader from different/new threads + # The error when trying to use it here is: + # > pywintypes.com_error: (-2147417842, 'The application called an interface that was marshalled for a different thread.', None, None) + self._app_preload = False + self._app_keep_running = False + + """ + if self._app_preload and not self._app_keep_running: + self._app_keep_running = True + """ + + # Preparations + """ + if self._app_preload: + Logger.log("d", "Preloading %s..." %(self._app_friendlyName)) + self.startApp() + """ + + Logger.log("d", "Looking for readers...") + self.__init_builtin_readers__() + + def __init_builtin_readers__(self): + self._file_formats_first_choice = [] # Ordered list of preferred formats + self._reader_for_file_format = {} + + # Trying 3MF first because it describes the model much better.. + # However, this is untested since this plugin was only tested with STL support + if PluginRegistry.getInstance().isActivePlugin("3MFReader"): + self._reader_for_file_format["3mf"] = PluginRegistry.getInstance().getPluginObject("3MFReader") + self._file_formats_first_choice.append("3mf") + + if PluginRegistry.getInstance().isActivePlugin("STLReader"): + self._reader_for_file_format["stl"] = PluginRegistry.getInstance().getPluginObject("STLReader") + self._file_formats_first_choice.append("stl") + + if not len(self._reader_for_file_format): + Logger.log("d", "Could not find any reader for (probably) supported file formats!") + + def getSaveTempfileName(self, suffix = ""): + # Only get a save name for a temp_file here... + temp_stl_file = tempfile.NamedTemporaryFile() + temp_stl_file_name = "%s%s" % (temp_stl_file.name, suffix) + temp_stl_file.close() + + return temp_stl_file_name + + def startApp(self, visible = False): + Logger.log("d", "Starting %s...", self._app_friendly_name) + + com_class_object = GetClassObject(self._app_name) + com_instance = com_class_object.CreateInstance() + + return com_instance + + def checkApp(self): + raise NotImplementedError("Checking app is not implemented!") + + def getAppVisible(self, state): + raise NotImplementedError("Toggle for visibility not implemented!") + + def setAppVisible(self, state, **options): + raise NotImplementedError("Toggle for visibility not implemented!") + + def closeApp(self, **options): + raise NotImplementedError("Procedure how to close your app is not implemented!") + + def openForeignFile(self, **options): + "This function shall return options again. It optionally contains other data, which is needed by the reader for other tasks later." + raise NotImplementedError("Opening files is not implemented!") + + def exportFileAs(self, model, **options): + raise NotImplementedError("Exporting files is not implemented!") + + def closeForeignFile(self, **options): + raise NotImplementedError("Closing files is not implemented!") + + def nodePostProcessing(self, node): + return node + + def read(self, file_path): + options = {"foreignFile": file_path, + "foreignFormat": os.path.splitext(file_path)[1], + } + + # Starting app, if needed + try: + options["app_instance"] = self.startApp() + except Exception: + Logger.logException("e", "Failed to start <%s>...", self._app_name) + error_message = Message(i18n_catalog.i18nc("@info:status", "Error while starting %s!" % self._app_friendly_name)) + error_message.show() + return None + + # Tell the 3rd party application to open a file... + Logger.log("d", "Opening file with %s..." % self._app_friendly_name) + options = self.openForeignFile(**options) + + # Append all formats which are not preferred to the end of the list + fileFormats = self._file_formats_first_choice + for file_format in self._reader_for_file_format.keys(): + if file_format not in fileFormats: + fileFormats.append(file_format) + + # Trying to convert into all formats 1 by 1 and continue with the successful export + Logger.log("i", "Trying to convert into: %s", fileFormats) + for file_format in fileFormats: + Logger.log("d", "Trying to convert <%s> into '%s'", file_path, file_format) + + options["tempType"] = file_format + + options["tempFile"] = self.getSaveTempfileName(".%s" % file_format.upper()) + Logger.log("d", "Using temporary file <%s>", options["tempFile"]) + + # In case there is already a file with this name (very unlikely...) + if os.path.isfile(options["tempFile"]): + Logger.log("w", "Removing already available file, called: %s", options["tempFile"]) + os.remove(options["tempFile"]) + + Logger.log("d", "Saving as: <%s>", options["tempFile"]) + try: + self.exportFileAs(**options) + except: + Logger.logException("e", "Could not export <%s> into '%s'.", file_path, file_format) + continue + + if os.path.isfile(options["tempFile"]): + Logger.log("d", "Saved as: <%s>", options["tempFile"]) + else: + Logger.log("d", "Temporary file not found after export!") + continue + + # Opening the resulting file in Cura + try: + #reader = self._readerForFileformat[fileFormat] + reader = Application.getInstance().getMeshFileHandler().getReaderForFile(options["tempFile"]) + if not reader: + Logger.log("d", "Found no reader for %s. That's strange...") + continue + Logger.log("d", "Using reader: %s", reader.getPluginId()) + temp_scene_node = reader.read(options["tempFile"]) + except: + Logger.logException("e", "Failed to open exported <%s> file in Cura!", file_format) + continue + + # Remove the temp_file again + Logger.log("d", "Removing temporary STL file, called <%s>", options["tempFile"]) + os.remove(options["tempFile"]) + + break + + # Closing document in the app + self.closeForeignFile(**options) + + # Closing the app again.. + self.closeApp(**options) + + scene_node = SceneNode() + temp_scene_node = self.nodePostProcessing(temp_scene_node) + mesh = temp_scene_node.getMeshDataTransformed() + + # When using 3MF as the format to convert into we get an list of meshes instead of only one mesh directly. + # This is a little workaround since reloading of 3MF files doesn't work at the moment. + if type(mesh) == list: + error_message = Message(i18n_catalog.i18nc("@info:status", "Please keep in mind, that you have to reopen your SolidWorks file manually! Reloading the model won't work!")) + error_message.show() + mesh = mesh.set(file_name = None) + else: + mesh = mesh.set(file_name = file_path) + scene_node.setMeshData(mesh) + + if scene_node: + return scene_node diff --git a/plugins/CuraSolidWorksPlugin/ConfigDialog.py b/plugins/CuraSolidWorksPlugin/ConfigDialog.py new file mode 100644 index 0000000000..18f2c0c768 --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/ConfigDialog.py @@ -0,0 +1,38 @@ +# Copyright (c) 2017 Ultimaker B.V. +# PluginBrowser is released under the terms of the AGPLv3 or higher. +from UM.Extension import Extension +from UM.i18n import i18nCatalog +from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry +from UM.Application import Application + +from PyQt5.QtCore import QUrl, QObject, pyqtSignal +from PyQt5.QtQml import QQmlComponent, QQmlContext + +import os + +i18n_catalog = i18nCatalog("cura") + + +class ConfigDialog(QObject, Extension): + def __init__(self, parent = None): + super().__init__(parent) + self._dialog = None + self.addMenuItem(i18n_catalog.i18n("Configure"), self._openConfigDialog) + + def _openConfigDialog(self): + if not self._dialog: + self._createDialog() + self._dialog.show() + + def _createDialog(self): + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ConfigDialog.qml")) + self._qml_component = QQmlComponent(Application.getInstance()._engine, path) + + # We need access to engine (although technically we can't) + self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._qml_context.setContextProperty("manager", self) + self._dialog = self._qml_component.create(self._qml_context) + if self._dialog is None: + Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) + Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) diff --git a/plugins/CuraSolidWorksPlugin/ConfigDialog.qml b/plugins/CuraSolidWorksPlugin/ConfigDialog.qml new file mode 100644 index 0000000000..1616e9466e --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/ConfigDialog.qml @@ -0,0 +1,112 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.Dialog +{ + width: 300 * Screen.devicePixelRatio + minimumWidth: 300 * Screen.devicePixelRatio + + height: 100 * Screen.devicePixelRatio + minimumHeight: 100 * Screen.devicePixelRatio + + title: catalog.i18nc("@title:window", "Cura SolidWorks Plugin Configuration") + + onVisibilityChanged: + { + if (visible) + { + choiceDropdown.updateCurrentIndex(); + } + } + + GridLayout + { + UM.I18nCatalog{id: catalog; name: "cura"} + anchors.fill: parent + Layout.fillWidth: true + columnSpacing: 16 + rowSpacing: 10 + columns: 1 + + Row + { + width: parent.width + + Label { + text: catalog.i18nc("@action:label", "Default quality of the exported STL:") + width: 150 + anchors.verticalCenter: parent.verticalCenter + } + } + + Row + { + ComboBox + { + id: choiceDropdown + + currentIndex: updateCurrentIndex() + + function updateCurrentIndex() + { + var index = 0; + var currentChoice = UM.Preferences.getValue("cura_solidworks/choice_on_exporting_stl_quality"); + for (var i = 0; i < model.count; ++i) + { + if (model.get(i).code == currentChoice) + { + index = i; + break; + } + } + currentIndex = index; + } + + model: ListModel + { + id: choiceModel + + Component.onCompleted: + { + append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Always ask"), code: "always_ask" }); + append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Always use Fine quality"), code: "always_use_fine" }); + append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Always use Coarse quality"), code: "always_use_coarse" }); + } + } + } + } + } + + rightButtons: [ + Button + { + id: ok_button + text: catalog.i18nc("@action:button", "OK") + onClicked: + { + UM.Preferences.setValue("cura_solidworks/choice_on_exporting_stl_quality", + choiceModel.get(choiceDropdown.currentIndex).code); + close(); + } + enabled: true + }, + Button + { + id: cancel_button + text: catalog.i18nc("@action:button", "Cancel") + onClicked: + { + close(); + } + enabled: true + } + ] +} diff --git a/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml b/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml new file mode 100644 index 0000000000..5d307250f9 --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml @@ -0,0 +1,107 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.Dialog +{ + width: 300 * Screen.devicePixelRatio; + minimumWidth: 300 * Screen.devicePixelRatio; + + height: 100 * Screen.devicePixelRatio; + minimumHeight: 100 * Screen.devicePixelRatio; + + title: catalog.i18nc("@title:window", "Import SolidWorks File as STL...") + + onVisibilityChanged: + { + if (visible) + { + qualityDropdown.currentIndex = 1; + rememberChoiceCheckBox.checked = UM.Preferences.getValue("cura_solidworks/choice_on_exporting_stl_quality") != "always_ask"; + } + } + + GridLayout + { + UM.I18nCatalog{id: catalog; name: "cura"} + anchors.fill: parent; + Layout.fillWidth: true + columnSpacing: 16 + rowSpacing: 4 + columns: 1 + + UM.TooltipArea { + Layout.fillWidth:true + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Quality of the Exported STL") + Row { + width: parent.width + + Label { + text: catalog.i18nc("@action:label", "Quality") + width: 100 + anchors.verticalCenter: parent.verticalCenter + } + + ComboBox + { + id: qualityDropdown + model: ListModel + { + id: qualityModel + + Component.onCompleted: + { + append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Coarse"), code: "coarse" }); + append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Fine"), code: "fine" }); + } + } + currentIndex: 1 + } + } + } + + Row + { + width: parent.width + + CheckBox + { + id: rememberChoiceCheckBox + text: catalog.i18nc("@text:window", "Remember my choice") + checked: UM.Preferences.getValue("cura_solidworks/choice_on_exporting_stl_quality") != "always_ask" + } + } + } + + rightButtons: [ + Button + { + id: ok_button + text: catalog.i18nc("@action:button", "OK") + onClicked: + { + manager.setQuality(qualityModel.get(qualityDropdown.currentIndex).code, rememberChoiceCheckBox.checked); + manager.onOkButtonClicked(); + } + enabled: true + }, + Button + { + id: cancel_button + text: catalog.i18nc("@action:button", "Cancel") + onClicked: + { + manager.onCancelButtonClicked(); + } + enabled: true + } + ] +} diff --git a/plugins/CuraSolidWorksPlugin/LICENSE b/plugins/CuraSolidWorksPlugin/LICENSE new file mode 100644 index 0000000000..dbbe355815 --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/plugins/CuraSolidWorksPlugin/SolidWorksConstants.py b/plugins/CuraSolidWorksPlugin/SolidWorksConstants.py new file mode 100644 index 0000000000..016e17da2f --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/SolidWorksConstants.py @@ -0,0 +1,45 @@ +# Copyright (c) 2017 Thomas Karl Pietrowski + + +class SolidWorksEnums: + class swUserPreferenceToggle_e: + swSTLBinaryFormat = 69 + + class swDocumentTypes_e: + swDocNONE = 0 + swDocPART = 1 + swDocASSEMBLY = 2 + swDocDRAWING = 3 + + class FileTypes: + # Enums to open files + SWpart = 1 + SWassembly = 2 + SWdrawing = 3 + + swSTLQuality = 78 + + class swLengthUnit_e: + swMM = 0 + swCM = 1 + swMETER = 2 + swINCHES = 3 + swFEET = 4 + swFEETINCHES = 5 + swANGSTROM = 6 + swNANOMETER = 7 + swMICRON = 8 + swMIL = 9 + swUIN = 10 + + class swUserPreferenceIntegerValue_e: + swExportSTLQuality = 78 + swExportStlUnits = 211 + + class swSTLQuality_e: + swSTLQuality_Coarse = 1 + swSTLQuality_Fine = 2 + swSTLQuality_Custom = 3 + + class UserPreferences: + swSTLComponentsIntoOneFile = 72 diff --git a/plugins/CuraSolidWorksPlugin/SolidWorksReader.py b/plugins/CuraSolidWorksPlugin/SolidWorksReader.py new file mode 100644 index 0000000000..6a194187ff --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/SolidWorksReader.py @@ -0,0 +1,231 @@ +# Copyright (c) 2017 Thomas Karl Pietrowski + +# TODOs: +# * Adding selection to separately import parts from an assembly + +# Buildings +import math + +# Uranium/Cura +from UM.i18n import i18nCatalog +from UM.Message import Message +from UM.Logger import Logger +from UM.Math.Vector import Vector +from UM.Math.Quaternion import Quaternion +from UM.Mesh.MeshReader import MeshReader + +# Our plugin +from .CommonComReader import CommonCOMReader +from .SolidWorksConstants import SolidWorksEnums +from .SolidWorksReaderUI import SolidWorksReaderUI + +i18n_catalog = i18nCatalog("CuraSolidWorksIntegrationPlugin") + + +class SolidWorksReader(CommonCOMReader): + def __init__(self): + super().__init__("SldWorks.Application", "SolidWorks") + + self._extension_part = ".SLDPRT" + self._extension_assembly = ".SLDASM" + self._supported_extensions = [self._extension_part.lower(), + self._extension_assembly.lower(), + ] + + self._convert_assembly_into_once = True # False is not implemented now! + self._file_formats_first_choice = [] + self._revision = None + self._revision_major = None + self._revision_minor = None + self._revision_patch = None + + self._ui = SolidWorksReaderUI() + self._selected_quality = None + self._quality_value_map = {"coarse": SolidWorksEnums.swSTLQuality_e.swSTLQuality_Coarse, + "find": SolidWorksEnums.swSTLQuality_e.swSTLQuality_Fine} + + self.root_component = None + + def preRead(self, file_name, *args, **kwargs): + self._ui.showConfigUI() + self._ui.waitForUIToClose() + + if self._ui.getCancelled(): + return MeshReader.PreReadResult.cancelled + + # get quality + self._selected_quality = self._ui.quality + if self._selected_quality is None: + self._selected_quality = "fine" + self._selected_quality = self._selected_quality.lower() + + # give actual value for quality + self._selected_quality = self._quality_value_map.get(self._selected_quality, + SolidWorksEnums.swSTLQuality_e.swSTLQuality_Fine) + + return MeshReader.PreReadResult.accepted + + def setAppVisible(self, state, **options): + options["app_instance"].Visible = state + + def getAppVisible(self, state, **options): + return options["app_instance"].Visible + + def startApp(self, visible=False): + app_instance = super().startApp(visible = visible) + + # Getting revision after starting + revision_number = app_instance.RevisionNumber() + Logger.log("d", "SolidWorks RevisionNumber: %s", revision_number) + self._revision = [int(x) for x in revision_number.split(".")] + self._revision_major = self._revision[0] + self._revision_minor = self._revision[1] + self._revision_patch = self._revision[2] + + # Re-generate a list of preferred file formats + self.updateFormatsFirstChoise() + + return app_instance + + def updateFormatsFirstChoise(self): + self._file_formats_first_choice = ["stl"] + if self._revision_major >= 25 and "3mf" in self._reader_for_file_format.keys(): + self._file_formats_first_choice.insert(0, "3mf") + + return self._file_formats_first_choice + + def checkApp(self, **options): + functions_to_be_checked = ("OpenDoc", "CloseDoc") + for func in functions_to_be_checked: + try: + getattr(options["app_instance"], func) + except: + Logger.logException("e", "Error which occurred when checking for a valid app instance") + return False + return True + + def closeApp(self, **options): + if "app_instance" in options.keys(): + del options["app_instance"] + + def walkComponentsInAssembly(self, root = None): + if root is None: + root = self.root_component + + children = root.GetChildren + + if children: + children = [self.walkComponentsInAssembly(child) for child in children] + return root, children + else: + return root + + """ + models = options["sw_model"].GetComponents(True) + + for model in models: + #Logger.log("d", model.GetModelDoc2()) + #Logger.log("d", repr(model.GetTitle)) + Logger.log("d", repr(model.GetPathName)) + #Logger.log("d", repr(model.GetType)) + if model.GetPathName in ComponentsCount.keys(): + ComponentsCount[model.GetPathName] = ComponentsCount[model.GetPathName] + 1 + else: + ComponentsCount[model.GetPathName] = 1 + + for key in ComponentsCount.keys(): + Logger.log("d", "Found %s %s-times in the assembly!" %(key, ComponentsCount[key])) + """ + + def openForeignFile(self, **options): + if options["foreignFormat"].upper() == self._extension_part: + filetype = SolidWorksEnums.FileTypes.SWpart + elif options["foreignFormat"].upper() == self._extension_assembly: + filetype = SolidWorksEnums.FileTypes.SWassembly + else: + raise NotImplementedError("Unknown extension. Something went terribly wrong!") + + #options["sw_model"] = options["app_instance"].OpenDoc(options["foreignFile"], filetype) + documentSpecification = options["app_instance"].GetOpenDocSpec(options["foreignFile"]) + + ## NOTE: SPEC: FileName + #documentSpecification.FileName + + ## NOTE: SPEC: DocumentType + ## TODO: Really needed here?! + documentSpecification.DocumentType = filetype + + ## TODO: Test the impact of LightWeight = True + #documentSpecification.LightWeight = True + documentSpecification.Silent = True + + ## TODO: Double check, whether file was really opened read-only.. + documentSpecification.ReadOnly = True + + options["sw_model"] = options["app_instance"].OpenDoc7(documentSpecification._comobj) + + if documentSpecification.Warning: + Logger.log("w", "Warnings happened while opening your SolidWorks file!") + if documentSpecification.Error: + Logger.log("e", "Errors happened while opening your SolidWorks file!") + error_message = Message(i18n_catalog.i18nc("@info:status", "Errors appeared while opening your SolidWorks file! \ + Please check, whether it is possible to open your file in SolidWorks itself without any problems as well!" % (self._app_friendly_name))) + error_message.show() + + # Might be useful in the future, but no need for this ATM + #self.configuration = self.model.getActiveConfiguration + #self.root_component = self.configuration.GetRootComponent + + ## EXPERIMENTAL: Browse single parts in assembly + #if filetype == SolidWorksEnums.FileTypes.SWassembly: + # Logger.log("d", 'walkComponentsInAssembly: ' + repr(self.walkComponentsInAssembly())) + + return options + + def exportFileAs(self, **options): + if options["tempType"] == "stl": + if options["foreignFormat"].upper() == self._extension_assembly: + # Backing up current setting of swSTLComponentsIntoOneFile + swSTLComponentsIntoOneFileBackup = options["app_instance"].GetUserPreferenceToggle(SolidWorksEnums.UserPreferences.swSTLComponentsIntoOneFile) + options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.UserPreferences.swSTLComponentsIntoOneFile, self._convert_assembly_into_once) + + swExportSTLQualityBackup = options["app_instance"].GetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportSTLQuality) + options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportSTLQuality, SolidWorksEnums.swSTLQuality_e.swSTLQuality_Fine) + + # Changing the default unit for STLs to mm, which is expected by Cura + swExportStlUnitsBackup = options["app_instance"].GetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportStlUnits) + options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportStlUnits, SolidWorksEnums.swLengthUnit_e.swMM) + + # Changing the output type temporary to binary + swSTLBinaryFormatBackup = options["app_instance"].GetUserPreferenceToggle(SolidWorksEnums.swUserPreferenceToggle_e.swSTLBinaryFormat) + options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.swUserPreferenceToggle_e.swSTLBinaryFormat, True) + + options["sw_model"].SaveAs(options["tempFile"]) + + if options["tempType"] == "stl": + # Restoring swSTLBinaryFormat + options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.swUserPreferenceToggle_e.swSTLBinaryFormat, swSTLBinaryFormatBackup) + + # Restoring swExportStlUnits + options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportStlUnits, swExportStlUnitsBackup) + + # Restoring swSTLQuality_Fine + options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportSTLQuality, swExportSTLQualityBackup) + + if options["foreignFormat"].upper() == self._extension_assembly: + # Restoring swSTLComponentsIntoOneFile + options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.UserPreferences.swSTLComponentsIntoOneFile, swSTLComponentsIntoOneFileBackup) + + def closeForeignFile(self, **options): + options["app_instance"].CloseDoc(options["foreignFile"]) + + def areReadersAvailable(self): + return bool(self._reader_for_file_format) + + def nodePostProcessing(self, node): + if self._revision_major == 24: # Known problem under SolidWorks 2016: Exported models are rotated by -90 degrees. This rotates it back! + rotation = Quaternion.fromAngleAxis(math.radians(90), Vector.Unit_X) + node.rotate(rotation) + return node + + ## Decide if we need to use ascii or binary in order to read file diff --git a/plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py b/plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py new file mode 100644 index 0000000000..78f6c3dc0d --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py @@ -0,0 +1,95 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import os +import threading + +from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QObject +from PyQt5.QtQml import QQmlComponent, QQmlContext + +from UM.FlameProfiler import pyqtSlot +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry + +from UM.i18n import i18nCatalog + +from UM.Preferences import Preferences + +catalog = i18nCatalog("cura") + + +class SolidWorksReaderUI(QObject): + show_config_ui_trigger = pyqtSignal() + + def __init__(self): + super().__init__() + + Preferences.getInstance().addPreference("cura_solidworks/choice_on_exporting_stl_quality", "always_ask") + + self._cancelled = False + self._ui_view = None + self.show_config_ui_trigger.connect(self._onShowConfigUI) + + self.quality = None + + self._ui_lock = threading.Lock() + + def getCancelled(self): + return self._cancelled + + def waitForUIToClose(self): + self._ui_lock.acquire() + self._ui_lock.release() + + def showConfigUI(self): + preference = Preferences.getInstance().getValue("cura_solidworks/choice_on_exporting_stl_quality") + if preference != "always_ask": + if preference == "always_use_fine": + self.quality = "fine" + elif preference == "always_use_coarse": + self.quality = "coarse" + else: + self.quality = "fine" + return + + self._ui_lock.acquire() + self._cancelled = False + self.show_config_ui_trigger.emit() + + @pyqtSlot(str, bool) + def setQuality(self, quality, remember_my_choice): + self.quality = quality + if not remember_my_choice: + Preferences.getInstance().setValue("cura_solidworks/choice_on_exporting_stl_quality", "always_ask") + else: + choice = "always_use_fine" + if quality == "coarse": + choice = "always_use_coarse" + Preferences.getInstance().setValue("cura_solidworks/choice_on_exporting_stl_quality", choice) + + def _onShowConfigUI(self): + if self._ui_view is None: + self._createConfigUI() + self._ui_view.show() + + def _createConfigUI(self): + if self._ui_view is None: + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("CuraSolidWorksPlugin"), "ExportSTLUI.qml")) + component = QQmlComponent(Application.getInstance()._engine, path) + self._ui_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._ui_context.setContextProperty("manager", self) + self._ui_view = component.create(self._ui_context) + + self._ui_view.setFlags(self._ui_view.flags() & ~Qt.WindowCloseButtonHint & ~Qt.WindowMinimizeButtonHint & ~Qt.WindowMaximizeButtonHint) + + @pyqtSlot() + def onOkButtonClicked(self): + self._cancelled = False + self._ui_view.close() + self._ui_lock.release() + + @pyqtSlot() + def onCancelButtonClicked(self): + self._cancelled = True + self._ui_view.close() + self._ui_lock.release() diff --git a/plugins/CuraSolidWorksPlugin/__init__.py b/plugins/CuraSolidWorksPlugin/__init__.py new file mode 100644 index 0000000000..f1a7e74959 --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/__init__.py @@ -0,0 +1,58 @@ +# Copyright (c) 2016 Thomas Karl Pietrowski + +# TODO: Adding support for basic CATIA support + +from UM.Platform import Platform + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("CuraSolidWorksIntegrationPlugin") + +if Platform.isWindows(): + # For installation check + import winreg + # The reader plugin itself + from . import SolidWorksReader + + def is_SolidWorks_available(): + try: + # Could find a better key to detect whether SolidWorks is installed.. + winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, "SldWorks.Application") + return True + except: + return False + + +def getMetaData(): + return { + "mesh_reader": + [ + { + "extension": "SLDPRT", + "description": i18n_catalog.i18nc("@item:inlistbox", "SolidWorks part file") + }, + { + "extension": "SLDASM", + "description": i18n_catalog.i18nc("@item:inlistbox", "SolidWorks assembly file") + } + ] + } + + # TODO: + # Needs more documentation on how to convert a CATproduct in CATIA using COM API + # + #{ + # "extension": "CATProduct", + # "description": i18n_catalog.i18nc("@item:inlistbox", "CATproduct file") + #} + + +def register(app): + # Solid works only runs on Windows. + plugin_data = {} + if Platform.isWindows(): + reader = SolidWorksReader.SolidWorksReader() + if is_SolidWorks_available() and reader.areReadersAvailable(): + plugin_data["mesh_reader"] = reader + from .ConfigDialog import ConfigDialog + plugin_data["extension"] = ConfigDialog() + return plugin_data diff --git a/plugins/CuraSolidWorksPlugin/plugin.json b/plugins/CuraSolidWorksPlugin/plugin.json new file mode 100644 index 0000000000..948772029b --- /dev/null +++ b/plugins/CuraSolidWorksPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "SolidWorks Integration", + "author": "Thomas Karl Pietrowski", + "version": "0.1.1", + "description": "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura", + "api": 4, + "i18n-catalog": "cura" +} \ No newline at end of file diff --git a/plugins/CuraSolidWorksPlugin/test_files/test.SLDASM b/plugins/CuraSolidWorksPlugin/test_files/test.SLDASM new file mode 100644 index 0000000000000000000000000000000000000000..d6e85042d449efab6c76d86fd802d237c77e7e02 GIT binary patch literal 37454 zcma&Ob9ALqvIiP;Y}>YN+qUhbW81cEJLwo5b!>EO+nwa4=iZs=o_Tk@_s2e1>+Je! z*WSOX+J!@^T1^1}0Py8*Q#35z!?^N}3K;+t031N*_7O`M3;&+rR1d`1Zj4n?#ni}D+42|D z^i zH3mV5b~t|=8RgDsmo&IAitXPIafAQ>&;|kkX#eupL&kE;4E2_k3W!9oWko7Sj~2*K z5Ihk+5-mu~i(~fJt)Mv?y3RG^DG<)4xU3vUY&VVD`oh}3a0;mb{F`YX z(T_HnGHv=AQDblNf$=*`=3dDk2_y6yDnFSOI*ai?@@@Y8kUwRP^|`VCIxL?bOjBHD zfoDNb$;48`QXUSd#JE^%8C9}#*@2@d)>86&7Rxi-A4*4?sG^UnsdE2Kb0bAJZs1cM zPM`Y;^B2u|7qSHv8M`@tc%0UJ5fnU`e0~*$IC4ZDzb|4z_#`0y^Oy2{1S)&%nOh0V z@w;J;{c5sZ4tuq|*;qY6NIS~6rmR*S3PQ;8!Rn(cE9q=@W~OFr4%Rawmd_%al^xNx z`k^(K)hq!KLZ--u(2e3|$q|~A+EOf9dZ=|_aNEP(yV8AuYT~cE8TbRnJl-v z1B>WCsmC6{R2|g4K~J1}N*2#k0uJbNv;OB}^q`$QhAb)m%dYqn%tGb=C1v#sKc zu@rdLYt|%>@~gph^SOse&%y)Gem*!RJ#cSJMJ2y`45IkrjWM5B#aSIznMx}#-eio$ zR3BCIF`1}tjv{)S?r!?|LdHw>3eBuH&NI0n|YV~6css$0;JnW+NofDHPwHTKA_Y47i=RBIYKtaBkd zt3>Le0NMqp;EY-X=OWv4$-^~)IkrJPL?eA+)|s-U3Z%0=7IU`<3b>oWVNO}mHF*|H zDD*7E?`lVM4?IWX^!&6BUSE?@8>o%r22Pg?D&*hYab$!$(G+B9OBXT^iAJ}3I#Dy5 zWa#WU-Kc$OaYt0dPb?jAwOP7nxu3F(hqxRwIM<^oduR$cAIvBSUqAphuQfPA{&n6l zf9n*qPaW`Ezx;n-X!O=qnFZ?wS?Om%o>}j@mo54zc2>4T1%#Rga9MW_up9ngP{PDr z1__k=gpm8^K=@B61&NXoy?*4z3#1W{EOGGB(J-yEb&U|QFpxBp^QOmd^T|sB&<4Ys z=|6p3@^wH7Q3_!S5eiWV!3seDgBt@fl#Ki01B?Qh^tSoO2NN95FM}d3TPj??v;tJUahh*y*-%V#fnI&+EMZ&+ z7gA>9Gvwh> z(fn}i8~dHt*$gSkh#t0%WtNNZMd1@A_Y{9h-Q(}aLty2Dn@=XhA}&~sBl+JN{$7QM zET0q5=gzzt{^th$ul_vOfwEU#z~IHwB?t-idm4IDr5+nl;1BI!fXhe3bq7!}|4E!` zY|x11YUc-jQeZywQl_~!<8Y;Lu0F&W#%S*R^E;#FNh7bOly^Zjc!7aeOLNhO>*U+z zMpp+LR=;hSk&o#k-yz@O$CU5;2j55gS&T zcFim1oxP2>SSb8}a8Ywh(HQt^VD$Ixx>_2!uV<&^RY+zLCjDdq1p-F}DnTMa_VO(l z^NWPPl-a^?5r351P%MB6^O&a&>?JO*I5WK=7&U3w!A?N4h+3YO!<93n&6hEHP0%#o z3--?=Jxq`t2#^pfmioiI*v8Qa_3+y z6H|c9bVC0MW(Mk=r|1b_$1)Fy+%Lis=2P-%&+>`eLks61#GfcO6Y%jR@wI1(UP~}p z0hV5;vY?GFpg8>or+fo8NxG*0g>QwsaTt`MhR94)Q)DpK{D8!G&h*AJ%|7Ua5l@l!XC{ST9xreYJ_M)k;o0FK8XSq3i(ic+!`Yq zblrJ&Bad@u2A4x8-Zd*u3rX10&(vHtK8;*xK7BL*zcTwq~FKscD%%Uk!{P4~zo zuT{2TNlGD3&7f6L=IS@TiGLt zL4LfMyJqh6@=&A&ZzUMT^_&8-T!qemhR=^%sq6RWwm%u{Xrp3B5&e{DGmX{ARQMRX4p)yBK*Dx9fb zSBIZ_6?(7Vl&V=_eh&^+P0Z@Ux1Nf$FlnBRV6?WjTN%3oF%7o)jx#hpCP3vyue_h? zxNg=IG73>VI%5ukr;Wd)kq~IA9yk)C-tc9vP*zQL&qtS7kZq)$icA{M8>4-;@u1HE zMFq~gjK^t;A~V+Kg~CR0<{{TR?os0G8c?tMjbGpMEGB#^w}Jvh!pF%W|2-STa(SI4pp;rXlrYyhDYG> zmUeK^2s)yf18Q7~DuMs$7uT)0Hu4ix0Q)Q^0MZDJ6md@gzpyP#kv^6wJd1mfgCHRq zkL9b=uYpLh!z5_-jA$Ct0Z2Utvno`+P6=NQ;Px1B-sHjjhD_!SkYGPD@;1YiUr*}d zVN*R~iMz~B`a}!MNee0%PWWY~Kqp7OjFRydW+oC}ILSm5)L^J{{ zEtcBIr1WbUcr<{{5fs}IinJZ-81hPICdTnGX)6eVNg8>NNvPV>?y43KI5X@|iaN;9 zQE_DrrSA0y?V32CS9sFJ!*4*9EWE#j)4>IKiNY%LWf`kAZw>VjBS)ck=fx*u)T!WC zRnR1$q`#S%*?~m%CKhXS873U{aoRIdFe+;G)6dh?d z?Lf1nZe=un>bF@*hEkh=pphG;U7u5~25GCHE(^tKY@AJ!*Dg|d&1^(cl-x5%)WBV& zvnoFAZmA;0`YB5AASF0Klb?rMv_>vlAzosCBtE0AH;buDTI)Lhmhv1n;Tfs6?=lfN zDG2>2n{XA}O!NH*?wo@RxIkzhy@4LRU}~KcP={E!>^dkwXqV4;3Xt(k=}GI2=N*d#0>LC&EI3oD zdwvljo-~k!?(6~D<>}<(nSw=yzykzbXQjLK%ZF}N1y>4$t5^V+p_~YBFT1%=D>m=f znWl;6IUh!Y?Hr4WZk3mS*Po5w7JaW@OU=)Px^+=5*mRZd{TW%8>3S#O;*ssiYN(Ra zEAApC9k^NaZNXBNn3vjV2sj=|W^K$N))TfQFmQca!wDS-c%bQz(#vyk37Whe$AW%^ z0z2}$*vxYurhV<6ZG7a{(80FRw&6bUwU22jc2xKk++VzE2Q?;VJJF$Sgb|h8_&j74 zyBhH4`=-g^6|$Oy(bjQ4MXmXIFm6lf zmY-)`Y}A(RzRlk-jvyH{xACJLjsAB0nB52W1iQQU3I7RY5W*iQ=0dNE@XTHM0qn#} zA{+rAkK{!H(c3@MSs&`+QN$vKD5^?Zp3roTN1BDFGeabH(sZs=QWh{4gt3{+Y$8R! z$~ykUKwU}1kr0v5-TSaXjW>XMImsr{(WBONYA5bd=mz7JVtZJ*=j*VV%s>l|aLHLg z?Tc#JD{h-Mh`8@2T=kYRJ7wZ*TF z0#o}y%e-p3k6{hZaZ?JzZI`%Jua6UFRLjZ!7QK)SPQ|dkfPPGyLXXv}IaD);UvNJRIz^<%ZBpH_kHb}v4D)NASK7BYb1 z9nBB#x&?-o{nAeKtoJ@+6~Gdjno1V~ZJB~_Ud%b4;c7P1VhlMTf8@1ktVNkZaB2be zl%4sx)RRrtUh82yb#va*e0!$X*}&ZKCFxOZO}c$+cPyAikM5@36qTjBL#5%e6!;D1 zy9I-8d6$xs`S%qbuJ~Qk9^;NSPvp0x3Fzlc7^~Fr+_G~$Z8IURUpfFAUBg!_ep=Z6up>!g zaLhGuHO@XGg#!a;CNV(Aj&AEO-tDCgps_zSvTCYVRQoe3d~{FG0o)MrY!AP!51%cOV|Ll6A?)~mrOnqq z+3a%uic8bJn7e7I*e0RmR&65ZIVr7XDh1pjM%%jQ!P=e@tMRa}pzgoDRn0x9Ecb-P z)GWq3m36Frxsfbnw+X}0(H&-n2aMMl)@tSNsHaTG>XZ%qvPZP|vk0P_%WKaoG9fUR}uQ1PX%p>Q!A-=HXrXkq)DoH=>%a*{bV zMa9H%$i=)w8MLFmnxB|rO2A5HMg#5m6E;h#1s=hzTUspjnNgDs)vg^f*3DAaf> z=3T;8suM99Kgfo(J3KFtPML=iWRdRf5Z8y3u^T;yIY2NMzwlQ0Bvn=3EGIGYd5ig~ z;L^P=AIoZ(_MpcmZta&oZM<1y+3~*Nqms3zUfPlc=8%*>qc{btl{ zO0OM_nD-NecE-%b>aKUHL=HtW2iJG9vrQLvMb}F1g^RM`*`g1p{D740JPk-zaB!L(mUmiK&nl*AuHiW%5@ER}C>a5rlO57#$kmFJq z0V(2vZ6Fj!vDsINXR%dzeDiU2lAf%OqZ-DhPl@?)J7a++#qpszCNj~7k-3l*-@ZPG z+Ox75uK1LVGhe7#+N>O)?5%N|e#0*i$bzPzloXzw!7k>qC}XRZ)ZTNpJ&(O44}Eqx zxH9e%YfsldS+97~=~6(7WYl;fEbC*|!BL>(`pPA&=*k(Qn5|)RlC4pLIeLP|aw_|# zgpz<9IaRzaatYXSp?E3q8Im~Tcg=|vEgfxV`ux`rZ@ADR(g=$>e_NXo#s575{wkf>63bp zy}^1yT+mbeGVJ10{o<>e{WJGD!GY~izejtYLs?1po@~lM^kZ#`t9eIh;_+Qh%FNE2 zqvd*dfHk`3^l}mVVy(-1yyjqiRqFCrt$F|0V>4Y1ulGi$>t;BQ&qC#DoziBwjVAL^ zrUu$s(+k<@WV7w0Kb&w7I!9=q5eRL2Lg$r&)z-95?)glP=F1tETGq9+_0(2EMn(o3 zP4q)o{Nn|RnOBKQ^#bwR&I9Sqs-98v>V4?XxBb(45VlVHiWH6u^OK*N$+}NIiEhQzI8ge#nVR8 z@!r@4yBF-toWr!%+^YP1zfwz;)^(o5Be>`Fk{F4t_^{^3p};6Iy09P3U7n~eT-h8?ye=bWk(Fv zPpLMC=mkaT&Z|ZEfC(b`X;oqqsZUqr#)ze++t#;ovoPUw{@U7*(|~_E{t*k3Jufz_ zGD}eDG9lk$_3nE|l-TVSG04J(H;Qrh&zMXr)}N8*KSD~;t{7ilOs?mLBhgmkcj&xm zJLlMVL8f1UMiQqS?>0KZ4SM(XUB;p;hzyS^gn6;E6_gZ zEQ~CI{KHURe~SUxm%NK&&}ZT6O0UN=<|`CltedQtmQ4?(NdHY=5$G$4!bXPnEYkT3 z>^rq?|GZHyQ9~Y~m*CtxOl0-Tq4xE%-Av1c)u zT+E0#wZvqY-22C6PY_Wco)CQ?Ss+6oK_E~dXq?Jm+*BNxF&CglI`k;?3jZ@=ojPS8 z={Pz08=x&Kk$g}(pm89*kZre|8^5ffZiSwYWQCNW1mQAej&>e_0CYLD1vDTu2Xr{U zlp@BCKPo_W-#KV=%NKJ7!4wQjm=XKgUNFyKJ{7)*+O0;g=>xe6Wz&R(^!sO^~Bu_|D<4br$NWz=)nd+^7f zZ$CahnBU)^b^|ic^Y7kyrifrsYHeFWXJ7pZ$RQzh(Cm*$8IynpTE9?K-TEwGLmk6+h%}9cm{~ofd4S#k;b9L+=jDeFu0Z(6ExLH z#+a6y(`ffm|S@mz~yZ|F%(%7l>dJTydtNKU< z08{ADG4)UInSbh*v1h@lgkVC^cNGnRdK@XG(Banr1XF+m1CRrn%Q_z<`l1*7`~3cy zTKof2&cT%@kRl9%LGikyKzQqjnB3`yy;#Fs7B-~%4h+E_-zGzuQ}qh#k7R9!LWprp zw{!nKy2q#CexIlIGlThm#kc2C#Z=jTqr-Fb6MH&`pa%lv|77bC_s{tF-_h5y5_V|g z1QnG721((Y(L|@9%YI(%UxW+aI?`j!jOPOGCbQ&4w_=2pB+j!*?WZUxYW)6W?GYC+ zvjj5o6Y+DOAy~ryS5%RxvONr$sfzwH`MIDjV~r((>?51WNloU z8(3TbSwwlzweHQefyY%WN$6Z~Ki-|4{@C@{?aq{V380U>dX9Y-kim2@Zz)*eF;lJ@ z#ASri^E;<|+>F6)#iDBPj+8{pC?cw)aou~>ozU+DP z9`Il?&6;e>kXV8!r8A+{xw}W82<(AJPi3|gO~wejOsMw>3%6M?P-zp;Y`f-jxQ!25 zs34bUI(|pyG#?^Nl@Zv7IP>o$fT=A!5~HiWC#!|?5qPe}ji%@`9!{H55XQ_AST|8X zNol~*K&3o*i)Xwkj))CLsAB*{d;lKh9Q{C^T(7nkqy}mnO~UD>Xt-!&AZkI<4<{ys zJZ9-=#4=5?1F{DC#SE0wfK`C)#uwu8h|JmPFAfyy3Yr&0z%WxVSsWFAuBo_KWd}-V zJ0pY|ohJe^98o&49RRlw!ja1-HcbzKlGF~(!Pi?I<$<(?^mU9MBwxCN(>AA}xHtKL z>@9yFOqI|bnKN6>zeFL@%g&i=mF3DmT zHix2cgPu#*na`azGkOYQ@-N$(~I4;m`2c z@zNmm9>dU;nSFMhmvovCPY=40*7F20yDs`cv)|y@1--H_U|47S$BkY zt9VP?zTaVT2IJ_ALA@$L<1BeV0p$#Ig?a%GZL4cP+8!_18dj!&+Kxpga$s<#rq?y6 zov?{toBQh?a6y=9M`MK^A8|b{LY+j_U3bBzygbgTUvs0FqmcPRN*ut_1D|On1h_)Y zX77!97Z;sbNp0p!5NkbMi)MetE;l!RTW(iWT7$g zuCdpo!k`DZZ@+mJ)VKwFK2FVX@uc<6V|V{tVG-4W;GqT7v)|nsz*T(q#mx{I5RQKDin!P+ z%Ir2a%5%7m_urfGIi{cU-&up|g96OUgjvVDKRyDEeS3f(Ge20$(euXo=&N(F^Ho3! zeHSS#_Z;-GMndOQ$7M=pKjD;u+Dbnl{Ih`LZ&g`;naFEW!Yp0gtF$MIARf1qwr3fl{2arej`O3Nuqp?N0$N|I znWg*r*4`3NLKpr|J=uzxh7pmd_o*k-VF3V;{?wDgs-`Ii|48q5sY%%(sUh>SvddbN z1%=MjbbJL-EN%eakq!VSE*fLUS1sqtVHY|}AA!T=lB$aH!;w-&F$6rRz?u)1Dy9{n z{&u0)8(ASved4p(#dJNGv&oO5|q^y{$ydoJF4`_;Sg zBb~;0*86!1UsUSX<*k!4RS%sv*wu~wtyDg~c|LBg)xu6!i^pp`JH4;I?(5#K7tgip zzMGw1_m9=3shesOc2y7k1=zsTcZY(9ommLSk4g#2-&!qgt+h1F_j;*87qOREwcsot zS{6QPbD4~VY{ey1XKc40Q_=#iqbPFb2je4da>BZUgJDZbY7DO#FHpkjdZ!=Vzq&PV(qCWv1hJzu$x6cSrt~VS` z97y&C_-GBDtU5%y^vMgt@aqou(DRQ39*#&2M%1ZxbM}+{)nr# z3Lk-nmYA%fh_!Ls;Gg}TLKQVu4d6sovOrj+(NN+@;IHyD#iOL)XoQi@6!$1o*DFrn zAN3Wui?Jx#*axG-0q4;s87FgOnh+h_K`Bq{HO#-1+Og-`^z{6VkS8s1DvN$_{Vn`( zT9h;$MJ^@()+o<1#-$DdRYe&Y3_ei>etPokGM2>7%$! zlyDjZ5@Je(AKDZ1AXckg+#@HFI$l^5BJWaS1AFV)Y7^?Z&L zK3p#5RegA-v)B?8%Du$KB)to3Lr_N;=Y@!=ao9@dB$}wEQx?GCF`?rbY*m~ZuZjxQ zv&xDZ!|c5_0bYa+Ig+X5)r<&AOuH{sAqpYj!Lfm_(RD<`7C>B5U*jTcvRh8PoP|dDVne}Hsz8-w!zu+|JRCXs2rFjOvR1#GL_}!NNL1M~ zqGt(&RJY z#CVXzIX$_%*Rarpb*lTlrn=2_;kbA@!D+e=a{i`L4k-;g%UJ1#G&@n3RBQ)UwgqQF zD0%5J$9LpbY`+p`1NfF*Y;-tkgbca}WsK}tE+KIE%?IEl?2&$P#zdWAdiHd7G3YeX z`5oQBuQ~Vq>LurvJ8W|MV>Cfc&)JpRS$p426PIUKYY*KRoQKZlGGocMZ9gO8k;0U> zXIMqKtPcd$S8(IaLAi)c62r-FMV1_1a!Z(8RXp4Mw>DBbRCF_|ed z)xiN}`t-UwnL(CKny1`S0|}(jiOx~V=~i6fTEj8cW;&UW(89aM}yPwB4LcvocxC1>ZJLw@Rm>Ap1#A~*F-H+;2-wYr>~rc8%~q17q@Ep zNfrEG*{XZKU8f67Dd~B22=nnTyx#HgVv|lh- zv$8}`=vu#u4HG=1gYYr-39W{%4e7*%rCgA*43V;=;3O=fa)4ZI%e8y9_`pj08D*}3ox08rucF`{wGyow)=vNP{ zlb1flpwEKIuJfex!4q1;WdX=+5kUP>VQa|@0bSrBY$zc09mZFOuWgk%#{1~|PUWc| zOSld)dy09y%DHAK0P)rrx)L2M@}Vsb2654HFLW~X7?RTqP(AEx{5@z|e@rx#;UAV< z0_nZ#cjF12m6K4gJ)-!OoF*&PjB`Cdp7836jrZ)Wb;cug&S6_Zx0NF0DVdEhZ`W#| z@pQB8CX@T%vfI*zuXlg4oQg=OR+G61xIvi3ufQ|w8T?>H_a&Ge8ZsGqK45)XCJ>kG zV2ml3iDiI*jSA{evj zw&P-V2<)&~xWi(F?ppriqQEb>X>XHrr!^}*F8YHpsrQ7l)5+u}=(Vcr{=$GKkhmB7 zZzD#B=S_x-+$2oa}jvZPj_TOYh#8Nqde_A21|*+)ZT@Pknim52Pp zT|x1H+-!+~jW%R1JH_oVa(%v1IY7+Zq`G=->*51E>t|_VcOFT-key04-x)eI*7I8` z;Rt$Eyr<)Ngm_>z%GcR7gSsVbfWeM2=tHdNIsma;klzSZA^*juwrZriS}A zQoyAwyk3w8Dya&u`PN5iEVJX4nWZ@cxQ;*efPkQ^BGm*?iPVz6Aw7Exvd9W2z>X&I zWvhLlNJ{ppSKEPDEeJQ+?C6uDOWXww4IvS|qvH7FICBNovOi+g(<+&(ZHBZv!M~e7 zY)({!H#zIR zbud2c{XHJW%Dj7#6fz#gu~-`>LIG!EkT$Rr zu}_^4IV$$)@Zf+MLTQp)6v;S$OqTBOiR1V?Te_sNo}wJ)ai(*^(mlOq^26S}B_$_% zR+@F>a3B)cfLNC&Czm%wZnu|OW-*6AOfk@&&U-2@!Xvz>k6X)+iH3QFG|hPMOM!w0 zRip}ubYk+8yjxj37rrVzX}PT^g%|JoL4A5$HdKOQ#Y8f*O&iA&y8{lt`IUVeiKuye z)xCLJ=N7KzyC<^lZ1n}s1fR16G5R?KYY*%7l~`?_lq+dES)~%6q4M0(Q|z{dp-7w@|@BOdoH9G`^ z)}k$Rd1bC37wqo&!`7sw#1mO}5zdTZ7NmM9s*Ytvvd%Q~Y@TM<)tayLRqC34oNnIr zh&1g*KOd1hR z(swnDyo?3~L}qulL&zWe%4|fdU-t{rMHMEYILya5{E1ctPMl_bY3nkNN*$-bO?Xl> zzfL>3n{$efaqs1%Z?L78c0w!W;!VsRmPRM!jkb?2r1*~{43%^!FwZ$LgUQ4ggRRIx z6}q27=5tu*OLYAZOY{Jw;bF7EDc-1|@-rPJBfugNNTi}VBm#aM$KnGS?Jn==&lMnx z7gaieDh{6EZV@!!u*!c16dP9{Bl*Tnbxj&_d8d#Q=?-!c6D2BkWmwt^eC(?E6y}X-Tc$L>?gKJOHVThk4DBOzujb_^4L7E~l{; zzTUHTM}1N~&}$;TyGuJc9AN(x-wz(3IO70l8Q0NyQ~k;AB(}=&;!eYZ(TT1NyI+&H zZ?)ZrTv&8oQ*#Z+V`jCg-5H!}x2>s@LA6EQ%fEhR&u#O0+CD#dH`e|-QndVW=bG#8 zbpVI!dY?OK=XORi<=^^}gY*7Il~Xg93Cq*<=y%w+RG8|Lo%1kWlbicXC;sF$48{LyIwnf6#sEwSx6og~E9#XbW&1Ahg3v(r zNQrbDjJ#@Z&}qC?Ay_9--bL@}Y$eYorbx0Cyi%R+sr;po{}tgR0gvMSsFEa%gFk&& z8bD2LcI05Z#foLPD>i}pNeRU@zR8*-i^U!rL~7kG4IznqlD9swZ{ z2pkl=#PNCkGw|Qi{}lK?vNXTnaX-huGBqZjy)Zy`WGSB+8r0ui2SCE8VyM7>?;Yl! z8;<15^RReyp0qFsdj&)4;@~88#bWfZK4u%&>R=bGjvuw=hP!=(gI})m(BMcNcl4ve z%?x)&k-+3UX83y1=|t&tde|C^Rmji%BQu*inC!YQy)P#+*-BRUZO4oQEu|H1XM!vc zn-jay@5Q3LB&A+%o|h}4#|w_b=QuPA&@GDMBqNi^aO`B3p_d(#`j>mXQc?`GdfV!! zdtDf}hagt%xszt2ZLP9KLmDJ_GI}wWb>a{h4AZrl1$HoaHL?Jgx50`bhe6*_4En0p z!O*Djg#!12uv`uJl3+yhG`--f1o8-;6rW~$cc_;wx7M$EV~a;QAc_J2>>~0|ESsK& zMV>I9UXLJ)MZV1gZ`mdMsEw`!I0@kDPofTP&!e2C#7K2bLp zOO`c5XvgE2(BHguJ4OEya8?LTLSMP9mbpgJt_7@K4dnwPT_}iw=GqMlo4RNJQcr}D zALg2ERjx|&jie!wNGpJCu|}}VpJB2ara8V9ovV)Nfc*Q zi)0cBAVkhY!x?&kR~}4gtsDA2YyZI;BjjY-UYxOQ=!g{)!>sxz#NGvq{`aGixs~;| zQXxZ}PP3m}4I@Gvy9*AXG`YK1t;F)>zAlxVEps;*L9#gH5AENO%$&7T2b=2`@ANuI ztZEu`(@DC`2E~XYbrw?u-cVl0%l3H`);r__3p^jLxL3WwR^OH*5Mrh(Ap-4!XL+VI zEw->EYMN<_^re+%DN7;`VEAC>uyuqapGHoeYFyyT>z=3Cosi+za0b|em`Uj+cew~I zm~tizI?Y)qOz*T(z*S4*eS%GeU(mMf1hFwuD%&xVBf{2v!u?UM{f%`H+@QA<(+VuU zDf_*bB*3K3)hbzOTM56FE}1?zQ1WnF>})fv9b9*-!#{m6`rzHrOAvV(XdXtAzippW zqapHPTbYbIjigY@?Boid2zjM6e5Za8Tp5bW@z1I4vMcGzoQl!wa^0zMeI0%czqfPk z%p9A6(#t{a#9E@ub$G1tJiqig#cC1T__`FCoId>6s@sFD>-o;m=KS7QnOlCow^({9 zlpDDny21A+&Rel;R4F*1Ke6_EKz)vX;FCoRbrFos$uSKz{(En49OU3%@NUIrckBT{ z|IC#_ekygM&q*wdD4J^P(pb#`^#(qtM0t_xLkF_&rGkIAvsT)&)$;r08XwVB{J7@UX@xfHE|uS6?b909TV? z7qx(rCcq-T;HLvPDp1OkjOg_7W9j(SfSX>K*nch*@D314It36M9pfGNjRN+e)X7Iz z)6~O4!BE1~2lwZ|87=?7tluOxh^9h60JGmjd|x`jm!mj(P_;M=eE>#L=uz~KBI?aS zpfHMYeW|wI2A|&ED7lbhpqVQEs55F(aJ;z<0_?je{Ma2ZytC~a@P$12VB&ti!2(3_ z<#3>dH!z?$N_gCE1GHZFFVbfE@=C2OK?4LnA0gjW-<)dP&dj);8r>k2;F!njLU4#J zA_0_ehz-Edib%~$Oh^M~iRs6uXVJ)sIj{!#w>kRzQ|e91YwWHfh96!JDs56X8rL?| zw^d(-N>X22>wMZ9i4Paw%SDH6Dx5Z!BSpx@J-?pq`MjOzWR^5>Hy;|fH!B&=;=HPt z4^}hC;jVN{Dvqpfp;>J{FnkoPS6RNg@8Ch!eEYf`OLPHx<^ULR4=RcZ9}GzE{OeJmi>P7`WOMSSpFJf1({-}RK*z*ZPt3$O#l}F# z!1LKt^UMcN&&aQQC8Xk3s``yMg&2tBm9C(b&HDBr zV{MG=Kn64;+<8iMz;Qw=byE3ZKFe_1{pQFL%CJybP>_J=`d>JJYg+*id7`p&%`{^l zu>P4p_`A9Ej|_01r(Y0-+F_h(ju8sLAC06 zUYs&FF7A?5;a_sYGStq5VEU97`{(%WEB#Au%=7aPzpeD(1FGmeDwv9q@n`h{u%TXv zR|sN=G=BPUUN1bfaVldGy)w{B2s9ACyV<6j-Uqy#Z;u^uwYq{)l!vy^|EMh4!qt4*_H~(Uw+F+qbM10^d%UJ?g~*n7n+GU` zn*~~?#&3GUq*qXNKx(5`QFU0dnQ>0gy1}IdaKVAnf7TDwQ={6$AYHGYz?o)-kR+>8 z@hc|6=IQbv>cKM!iMc(K33(*LE05%1e4*G}MNE#2K(XgLntBA=pdVe1HR!rMtd8Oa|&eWe) z=y$%X`G2j?y+|sUD%-+N=;Bav0*~zgJ#_FRP*-4HbKRcHk^J)Lw5bf!9Z-PquwWHl z*w?s??xZ;v@CLV}r;$sZfb|DNQiqTL-tW4+m8!OEv2g24uAs=;k;^~g$$KoKU4r!G zi=pGGged#q`F<#v8Oa@hzZBc(HOs`~D+)P>{QQbXpXN?j-*NSrtfVhUu~FMUc2Yd* zezOSwI(>L#OFls-;BZ*bH)G~yh^4qmGCxMij|pnmN5TchTAP>Qyp^HNZbtz3(Ils< zb`3k&hrF8Ed%*IDqaKFc?WYOzA*I%#hGbTRyvSq+v}Q7n)23_d|7lJB6wD)5Zge&J zKWjmL`|bC_gZC!NBrLyynFtIFd?P%l0w($in19&#ABF&ce*wG|_fOXy?>B+@yT1t_ zv$3WA5Ac3_{{Q92e|FH5I)lh*efsgqpUuU;LHl1Mh*KV1$WXyTQWw-@q>&Wh-%q9l z;CalW$g~R?^uK^aM}$KJivS~Q`V>i8K3TBIAJ58AfY0FLa$_O#cwC)8z~!{*?~I}w zaeG)wGvo5;M=6wVcCI%RCxwvu9VeuoXFhI>ciMGlW6WB>QR)w67F@><#<6fR!EXTP zU87GoD?`BfUhcxL(8e&ry1!KV-$`PI8XMdrNIWzy-0tu9_N^r1@l50D6L33=HR_;Rw$8>OsT%?u}I zCwUrN%atY*i-GfM!cb)r+*M?1BptYQuD^gSz4A%tmL8>gKT0@L1vbLh%e>Ov4zio+$6%|McgqzVYjuWKagR6W>_$g?s` z^E5kJhd(53{_akTRa=3?zn>Y6v0=|Ka8>?IOlJXZ|?rpPDsH_Z(FtBLAO*4YtBK8i4cbj@s--!!t5Xb`KQSXScqRQP3SatDUZbgH#yF>yyzC5w!`V2YF?CP#-%NM+4`hi)m$CI&*O&T9!rnH(g6G%&GKI(Y5iez?khoGbQf zpTy6vX`15VH72B9!g4Kfirermb-Q)DesCEyEncTYJ!G}qtLI{2*VrZ(5yv%C>F65c z2tDSh$>ed*0Qbk#jA(aazD8>djwNBi=t{AS&;oa^%&eG9P={m9K z75|u|qR8&lIzq)@wQf7yZ;haXOmDv+(qJ!Ib&Pi)IZr=3GLri_mbGg_H{UPG+Y3$X z-8AVl6q_mAwWv;2MAtUpg<{&B;NcW`8&)BVQ>oK&mf(?OY)ARVAG9uz`@%=KDVc^T ztukD68TYR0{Iw=EJrj-K`7gE5ik0}V<)QltMgPz7ySnkeAQ|*o9QHt#`j2+yu+NTO z>gF=`PtS^|v5mN=jFC4z91yfB={@-4<1x2SAjki+ce$BfzWKARu)@hll2V(4NZxr1 zkVDiI6#mDkf#w(S$Ph+gU?*U4;fpZr<<1X&0MlNGzcme3<4aQc$tN!=pE~^a)#IK_ zb%^a|=l5%L!kQ$o0CdPD$fm)FH=7j-!f_KD;hn6pw;z4tI?gvIebVHIa~zO9!Se^k zQoc>RhE?oeMZ6qnXn`ReB_QAXgirhPwhKLVxcw;w`(}}Wt=Jv?Cte;*?84+YPqJ~}%KQxK)#d-`C${4L zS$zBduWl}}*>;9;{}p5WRlLu*H^v^daf|m))6j~$X9Tz*`sqv6eaajEQ{JKvtRQ3$ zU~D)4s&M`NRrT}VBvjdc8_?_o1*?8~ut}zh#3PU3j{Nc(^!2jSmK?63BQvCEBDxZQ z5S9XkqfZZ{vc=>pFB+qmNd|d1R>WTeScm3`qB2Xao2t}j#P2J3C^{r^*z^ru_jT$3u(Zq| zKynZsro5NwT60XPypq2FaD`_jV5t%x@j%T{LrH9bHj+Dg@5rqm(f&V;{RLPZ&C&%5 z6A13^?rydN}zP`})_m7*|Fato2bfi8U~9TZIYi4#(o=Z9PO<-g-NE3q02iOZg3D z8-a#?gTK?gRU~~dkB~N4LpdD@2Hz5t2qxTmvN5ymZdu%$Jn?=!zd^4tzk&Y!7;rT9 zA*2GY&j}R&xpV&a7{s$(_a%xsUQ^a{yxcBR0`GQ!)ApCcP^Y12eaMdHl~wzUv=hRs z5DP+|ok%Mc>g1@d4DWXD`=&{+$QhM8RF<3lq+?v}n3I|q$s|(>?ap%#FY9!EFL{a4 zJHY1(!7vo6y=H~Bzn(}Z7QH)-``(rB)>3B_h|U>7TL-eLdWNpN=J2{(^uaO8 zu%0q!IF^m4lAt?@yA<+0HBc6QQ>v!5#yl`~G48JUaVt*{&RR0GG=g`gKH-v7uS*29 z_UPid416?XRCn8k6f>_54V5>?>nptNVrWiWOc$6ViN{Nn`LLILeV=wK3}X;74A|8& zx%XG$79ZpC_`&1VSk+ zlHYMx_`mKEj|CymqBS2S9LK6!h-AT{!J|f)#&$wQdfMQ8o$*}?E}lk<8uqC|&JvE0 zK@kd+aDoa%y*FQsGncNPtu!`R{*~JIGIIL!%y?MHOS3f25W#BdA4qXX`kmEo>&0bx ztj9B-t{RA_M83w+Z0^>Xua77~0YXi5q@ZWumQa6uvVA2Unny7P7IjI$Y~a*SG+VWFV}f^bpkC}MY8p5Pg`II{{%+Lq8i)B968KXT zWI84oAK9jh@u5YECHJ6-sYwc4_KdwXWTalzp&a(g2tCTxt2w;0T(Ocz+@&Y>oH&KaNJ2_a% z3snJ6i3y1DE^{ZdlMjG&17d!5@m9&c5tNL=(40gW^1yv!kND$9qE+743hA9;ZFv$| zrSf!-?N$WRy3&n)raY+YL4JCm85}+CvayQGVldBPTD*$#a2rW%%7Hn!p~5Ly4pw~< zG#aa6wl+z8Q#598)ZD@Jq5M2Nm1cuK{oC}wu&nef=r;ARM1dg6>h574?U(DDU<9%9*NIi;0LoU zoB_paNPtzic`_?f!SN9c%V_LdBL_)o6B5i%j3;kpGcHXTi)qmxizJgAwkV^<2TRXc z;3f+;={Qnmwd1Y5Bb~9EN!v~WBoGm^M%jc|NNcJt&#`?ZO{2oyM&6%96v@6j9^DQ1 zOG>1)&rnT;3%C#24(!h-q;~t*W;2Ta;UY60oW2R2Q$@J{br zX)HrF&Os8r{{1_n`#D?+RMDo(ABmeNc=tD$6zU~=Pkkvc1xs3*2^1PT^bwM(QjAvc zD95_zgka;V!-RV0hAmGy=+Bl5-oJgc6)qIygYL8lJ>^`guQU<`sC6+ZStY!|}1wBpF00 z3U?bFEMCE$H^R{SLpC`asI_!ikcd?0J|D;OCzu53UEUNlaBTNr!!kgfNydNm@=ZlL zChcoC6JX8~(-1FYm#adOZs;m37X@!Bc7k!}%%j6K32_|xKDq3}ryVZplY7RkU4>8G)pm7BX0zo%jflF#m(+?bAD3yMP$qiio8mPuY#POK9DzOf0-irI-#8k zu!mbPe68Eg!_bNN>!9D@q@cOgQUM1Y1vuz03x@w*PuYR%LocIl8T0!j=CClZzMJ6s zjXo2kp*3-nS*4_~UBh9A?lIZ>Wkb$A53ZY4H&-U@Yk0o>RrY*3tijG9osTV+1NV1a zS#fmPl~N9E0fBhL(Z=rHs?z<&ryDaj2s~y`>SPO@1?B??6Sh)*%Rb0C!3ekj+0%&5 z+e^(u|K%|Huc1}qW*`A5RQu4$Eh1#5`LWOk?H(MU@%dkUUWNH2ib_7WLaq9HgXP(6 zyupcL7;`9hA5{6SD)UYF>mVnbFtbb_PL;PLzY3%ER#8*^XKhI$%QCW4kxpf;9Wg(* zxAkhA@cZ|~$BwerS6JA%b_aq)MfCvY<1BMQ-o2d5Z-964FUu=GhgB7Ln=t#&wB()k%k0pT@R&co zbuJ&-nVjlLOMSU07+%Z+g@yIeBRSVJz_kfWkq zLVXutQMPG%nH^q04zRK(iRw^8Lz{JGE4q1Oc6?CwtH%r9Bg>ck+PCNyT&0hT)O5h5 z_BLNhV|zBjEkaq{4kE=s^VOt*lmuZ-S(Vi7l_Y|rTTjMgnNg0~(O4@(+Tw!jmY+)v zh>7-Cp8ocrR-=r#a99~qlU1hi-hw4b1zI8|^xZ(WWMY8-odb^S!>8AV{BFSno-9QE zkq1T?yt4d^?QbPWE36KDgq@rQJ}x3cLmMo^GxNRWc5kJ4x5&H}UozRWhs^*7!1pyshvuYGG{0aFD#XwfBiXY{oa*ypz9G}k8*e!hOY z&(Gk$ozA$k?)F54z@^T6;11}^>do)^fNw6R!Q;2tMA5e2D2b9QDeb5%SuJrQdFtvt zcYU?rJfqMFEfF>7m-w{I?$o^B%@``my*Lz0H0k*Lh8vICN$KJ zc~MzebAa_0OD&xQNs%BjoOwG%W7j6B+@OVRHSsL|#~=OT4H+t;nUC6RYs(;G@eCoE ztrh&~=@t!3Ij~_%m7H2iN2m?P{%5ESF4aeGa2iiewmS06-rte2Y+MZ=1q33Yc!Hi{ zvX5F!Ee+b}$6`7~n@aZfblKJ=w@tH$$bFu=II8(l(Zy+IaY+26-X4ffQ)}dVs1{V$ zGR;puvETF1)sACw;)_`f#s#2Ia?i0!eWxHTYTY>N-1y+6 zq)YmnP0zCCUeMH+^MlK`Z=s=&H{;tlPvuTcPy4WF$*I8_y}iSokwAN)N^7ZtY%0Et zV5l}-*gR*ZW7ug4k8B~W%Hrt3LmQGPH;t%%k`rjv##u6MrbbX@^kI`Zqj4li-yL2y zd7o8ot``ytW*tYO?Nb_wjh_C|l8gYMb9KoWg}Bl*JC|sz<`6p_abP_e4jR9c-@xk@ zT1@TZ!NOjzm#*AvVZ1icqTvup3|6#l2K;Gz#*AnfW)YZjfll8P&PZl{A*JXr(2uAE zXj8dttn(J(@t+d(rRtbI7+^Ib1u7Dlhfqm~`sa%HsLBNh;3i4o(1a_c`c8csDzStZ_gFZOpW?=#-YT^ntvQ~6DG@f6@>trd~ z6lv1ss>dZ-sk4~}zgAj$y3UIBG7H|U3J;llr%>+Q=l%5>5e@-qaYa-+hnZ#xX5Q8} zA;RO?_f07pS()b@f1Fq#i&B0lmnvS#C>0fn)SJD)UIit%5;hxf02y>bD)Kx@fE9Oq z_SbPL@^n-ZN6wNu6W?<+>_S7akDSAw-pRtp^D2umDfKG|F|IR>k%gcuLf|0;fPAFt zenTvz(9?y6+nr!!gQo>$<=dH^qEJvbsc>%ts|9MpBn1$*PatCJ%dvb-+S{K`CL{1( zPbTE14z0fsm#oMNkNOr3LNb}A?JaLI16rE6HKG}^qr1Y4pbIC6Q}+sD&e6~h_m)qI z(-(;%y5pZAwYU2gM|h{z57(&2oHiXtL8baM;kZ3)^jZ+$Y5XxtbKLQno%}zx^7^W; z2aRf)Cn+waL+syUz0crN*7OK)DdUFm#xJ#wYDn(>`mG>1`G)Rxt^g$t_6kXv;yl9gecA@CwBO=lnl3E85&qxnIE9q>I zy5xmk379+k@55_7XlRjkAl!%*zKfZU3NWK|AU)Ud`t6yXhL@%IfA{Xt{<^yS^DNbG z8*r~a**+5)=Puu40#yK2e-jow(XuQ>Gfwn6-Pt062_?yestx``NJQnEYY>)=mg@ow zly9sPL;@ET5!@aY6F~l|xOH1~@}Xbz@a-1Pob4>WVR|N`p_Zv>AJ$gsmRvuUDQik< z@~D62h*kX!*Z95C`@u4)-SMaSZQ!#qWA9I04|zY!DbKmCj~=C`ZKrc{b~Z&VW|-Ui z>5ZM}hCdrWsX8I>Yd0P9pLst_&X}>O-dm1(UTh4Hp@&wYz(oq7tN6`i(7siB6{w3Q zUCB}k^QG%>ECH_+gtq%E?H#sCz>Ji>fDN;3!dz|bdG`%jF8*=mfxU|U$m zI*wtOxGzvfyp&!XC%_`8d_w=%JgeT|RhFpQf5ZA*tMqFe2V&87P5<`z{#_BqFL8LL zOvC&V2VIU`+pk?R<9tq~?F0^PDcqOtWAT+FmEU?iT>e{+$<=@Bu^s)dJ@%wl{k6yK zBmef;aqU5MO0+YfD$`!}$zinc5hjrETKxKc);sE+f8zAsE6GA;P44nUq~=G1QkV2- zy`UxjiJwJ>SH+j&&j)W2L>Zv8d(BVGAAf}1UIfB6`!U&_2x|63{*Y=no4PuJ$~c-^ z!Ke**B$;D`;&!=A65>JZ&9>TuKw<`gQsoj6(GETZ@u{>TLI(4Zz%Jz~Bct54zrlUIR|#o(R!(^#_e$aV&Bh(qOEZ z&2wpD1Q7ju-q_$6YJv`=&5gn%YgfLQU{v~0mZun`dzbROeZrZ=Q^Xz5XuNb>+2?(< zAVmLpQUt>gEOWg0i<^LXc>kSN0TE)r#-7kINs#Sjl)3F~aqCT3kIP;EXU+$;V0;0! zF-jz6poO@Q1!ho)hzuEI$I>ZuRRW&e=jThMaOa&h5)4xm+d_cC*c!4yjhYOFf!*}( zB1wyv7u7Sxt*vDf^`$&B!qDxK(DEpjPnuNkG+G!Tlr1Jw;<UTC>EJWIN_ z2}2ay`+e{g&(y^}e?{Gr^?*A!7bi#DQwlXg1#FcH9s|)P=vH=k2Su-?fLfm^GBYh; z!(FJ9I4EqtqX@8}?5Y~pV{vDy`Pwm6)xQxNYS<+vIG5PLvyH4*%C<2+SbDI_lm{hO z1R-g{8~Z_$Ll|+p&LdB4gw!AtpwKq~9inDMN3vH=v}xCO_IL?S-0V}CK2B-Chm%qRt_vA`e zWI5izM{WSi-oY~=n2I@Y{D%%P0{|!SB0;3oB7^#lNVV~`S4&iRuD5b1fPt6+BTO^6 z5uir3wI86hMM6ZkWge^+XHfM%Se<8TX}_Zk@X9l~KZ_CJXkRyJvr;)28#vgfM4ORl zkPbrSwwauzlm?!mJ#9ki(g?WwYtf-V-{^%Q05KAF4Y(b=jOgGRz$O97H)emkNI8jK zw5oZLUJAn;S_?lUQ)a34Z{(Y+Xi--}>972aANfeWNuLXF7{yBt-Kmh&YoIyKI10)1 z;v`<3h*(&kaJmtzaz@alFG)U+p@p#trPE*-lMM9@9A%O9the_^I?1Ai4Bt&i`w<$VZ0%WcTRZ~ z?04nhUwqolb3U$3-QO7KQu&%2^kE=fS&k4C(J@d|=KsbPxqcn@#y}k6Y za&Jb^cJJY9S@ywO?pZ1K-uEr?UN(_$P6)EMLBvKth6I%Bf**Yw?&1w@e6@)Wo(}M4 zf@}z~?dkhEe-$O9x)A5*F7OZ;vE&xM2FBG`eH($)q0QBJKgj4nNn!=|`gFYOmS)M$<|bs#Tg%Km_z=136?v%7gDd-1$4UD-cvsogLoU}grqb;0x)plI@K$~3$#@x8qh_zQ&u!UYR~ZC@z$!-Q z+9BTZ=%#bT_0BHdGR%%8^lVMDMvPyJ&m(yO|)JBla*Y*}XCZcT(||XZWlqRAy#oxEcdC8{R*Z4|Qonr_U&>Ka`Jjfp0d5 z-=l1=pCu+d>Jb8?Y9@i?Ks;K&-zB29rg6Ham*bnxP6!AW zII}Y?Bbuh*acNSs+y$&vnLs6WM@JQeZ*YC^xcui2&0_;yvLp<_tC$^=3?@&CDc~e2KHOAqAY8pVjOo0qH0~Om9-2kvdTAZ2IGLkscKvBFDS* zuZNrOAdZx^Ovi1x8uiu24-dzOma4cK4S{D6-gnm{J_<+J}uI7Cwiz%e`(c&(FimU_zk%BwHct$~->|3PqZIO7}AXOH9!oBu-2-W=2vzV#p z6PpYCkPEAuuIblByr>If4{TegSX?$IZFiuV9a@?N*ioR}X2Yu@gkE70T=Jh56nJn} zA<)owc^@)U<6QBV3O)+i9ZQVhLO4R6k+7G1PCJZXXnVyEecHbyER(dgWs$|)Tb;lh zVf4DS=akTvFc5H?+3&nJxO6|k-e1I78n)8gJVDI;odTZ=V>ObgvspZu<4jR?z#XO) z9!i+5<+cyKo|%TCD%@-eRs^tc-LpV36=P(_tYfQa9;~51t?97+TJ+KUP|GS|e3v1( zI2F-_A(@{wSJskb?&QI7%b6o(EsJb1(K-TzsLn3!C(GWjC z4S-E??4HeVPE5*#$8il{=$qgWTI>$nLQ<0BPjL2KaJ9)7!G5YvzwQkwG%3xAU$PX^ zrcz<-4XHMXA7^&<2vT5As>S2Sq&!TGDb}K_8C=-Bvf%M=4HWAc95&4X9qa4nOl}p2@&K9tbNGN2x6Qv0&=lYKkE6#!iY)wmFlrcff>)uD&&Iw&5 z%TY9m#n!0plinN$x8dx?&pt3LM0}wqG23gOKeCmRm7R#EB^GRc7ygCceXd4$#P%ELY*v9=|IU{kY8 zW(k@adD4ZpY3z9z=7m_Xu<3w@&j7ly{SdpS?*TK-6(FYYk zah2+Y*2)lAIT%U(K|2rowOOY5I}00LWWS>@WoDXdHv%4v+7i$?a^^<4l%N>q_Bg+Y z14|V4#`ch|t1(u7zUz`qb4`n{+ox)~xHgr&YWk6{D24stE%7xF`zWsb(wlUKFuIdhxK z=>`G!h{*L(`vE?xTczw`&0?moKKD4^0D_IFrq*WZWSEVFcJRAz;JVpFmKTR!e=E7n z)72mk(ut^H2Y@=8l9bkeg#@kWZ{h_Q6e2YqkX?~MI#D&`05Ew=k#*qOQL8y@UNQkC*Bq%WS z)vaTRs$?R6N9Exbpg(K6_?vT~(rdcz`@!x@PH0%3BbHD{7l+-iN45kXsygFX9-WdZ z@o(JHd8siB11h;Ac2;QZ2xO|T=zAmHPC*WKqj3R2d#s@=SI1gyBzqf5@p1l@?w`-k zQq#dOL{kWl`PF~m1wUMO80%-OO&YMZ? z%N)1SMMTHHR5PGDrjd*(?<^;VXn@5lk9nNu1_G&Q)H-2dFiiFnN9t5U=4KW{lv9cl zHqlvx1&xg<%mQdksa-Z;C+yCfiBV_hb;!TNxC7r1 zh3Zv9P3qXWCP3TwrD{6@RR#%DZFKhZtvUKTrRWs}DMjRJ!-cU&3B)DJZlZ6>LY2oL zPI@;->fR3027e>2$ev6I(J-PCSb%)DOfkDX$Y~ zCHN{wHy|>KSpiv{0bF8|fkTDrH$0G(u`r&=J>Rc-@N`@(x>5F6+?Zl8~ zrPfTcipsr7nfT&&rFNMrI|>OvYm4uP;n|WK+WJnr8ZKMIL#{e=*PT1I@d!oj{ zZt*(E#bU1*ixiV{U|Hr;C3OTZZ~9;t3sO>wF5m)!D~j#LhDBsmcUp;crgJVgMbTkg z1OtS0_KeEelv|%9u~Sn+Qb}}9_2|E(Q>PRSmZaZw4qr-5XI*X@AELI@=kV$8q^C4t zn2?sHXNAliq!fj0UcGV+;8lvh4E@jyw0IUxU?sLMI|m*_g^WtOKGR$#VS^oy(jn}m z5SkZS`2=DbIp6@TzHZIt&=2f0DQDAY_4<;5l@WqtOeIqK#ZJsPSMFV4I|?I>EYNQ3 zHMZ}Vf2$bKPN?;XNQaa~u?KJ@KcZl2>_TzKd44CajDSwj=91FhOS3ngsXA9VQpXfv zyz?O18aXBck6iIQD+f0!l2YAE^BEeAq$Q6<(Qj~g8bSfC(h0(J^K3Vk%d8K-BvUY@ z(Wi5PRg{(Q-Ek51K^-9&*4+F8-9r2{7|UD_7|8YLt)RI6sT1uZi>;MFLjqDfVt-Aj zO__Ltj-srl)ge?-gCJ2jXnPCq1N{76uoTLch^6RIScj$=vW(=rkcW=u7?+ckvboS? z79K^v^lWF@6%X#^kQ&a+mSf62${}~K)M?*BUl|m2r^f-6xh3P^Gs=!M3u9#n*kP$JZE-<_gbDnu zX7_a>|6QE2j}oKl$5Hsu8%V;a=hYsxA50tDG830ZgRA84QDiidSsmhMxn!nn)82@d zrpezsm3y#%eq%X~S!}U!s&DUYA!O8YZC&iby1fLGl>zqFoOboccgvu0mMdlt$xM^M zAW5=|OWI!PYKIsPcFY|lpTGR0lW>qg%0uaSl4wvpt)tWX_EQqBL<@TwUgQS?yxfmUs^{8z@@!CE@hWA z9P@JBHOCP_^{~-;A$7iHZe9BNnC1t;T&5@HIf^zgT`#lJWxgiq{dsK2x41L)$g}0? zP|U-|&uFJVlv>HZ^X9pX6BAsA*HtRDo1&j$hkfRi-d#Wk)a><>iSLv1JaGf#WCqS6 zg(!1Q!TVV2MmO;EAw+f2`_&n{-!s{5JAT|Jxoj(PxyH-bhT`>aAJ`-oZ+Xup1etS6 zeoH5A41{)XN3^Rxr1IXfe|-z-fOw}<#}<=Ee@4zFbeetYzF0F_jF;p5^(GY{9Ldg- zscK!8aOz0N*xit;!gGm0a1$6cr=6X~Yj9yFq&L`;K2*=+mqs{O}rK^UM5EUuXtQ9_W9Zo)wAQ?M~W;YV&K)q7}DC zVm#n|aZ}+^^WrATgYed6qEzXhNOPj*l4JgfRD5W{q5QyoyyyEPXuo=7Vd_hu>$V+A ztu^m%ATJT_yvkhSu*T1yJ^`cXKU3G1*W<~`>)*cjKldHtyp81*23ltwJ~8!q{1aW4 zI?wjNWzk?d7BGx8HJNv8Gr6rzw8eX(r?%m0XGwRf!o!;3!Z&2&*$mSVO8 z_)$J#*A4KGygyta1@YMHaO}Bjn}FnlE_mj`z`JnR2gu&cX>!<>TWiEL4$OYf@S*eq z+#Ego)T~}-HZ31I9o8-^!NDZTKriB+!PyUzVqkVi$F?=yx7SEc#mo)u{g4ZvJ!Dt6 z={oS862cHPwmos_pXuUsl~4LU!iyhWgJuq8m-yW9OsvVQbUMOSUhDHdV8)Pg`}FzN zvC4$n8cyEmuq=XLWF!5qQgc;NPkzc{A*Wcyi$$(>w!hX2biVXkL)~C^Ogp=r7}8@s zi(d{O{hnPyUDptwm8kU0UXqSb-Mg`OkFW0NKz6^cC*?SUAVvK591V&ZfAOf5N` z+nS4=H^53}&dGjHkiHq&#?V?!(}Ooj%Hrs+T=k|&wlu!H-0fkNZoT`ok9yX=ZPtJT zi&gMArOE=?QL8xRP!e7=|6tE{uMEUw>I(zl0cDGJRz+uN>U8tL3Pg*mLZhU)^|{-A z>y0^g1?jvo?klH76h-il4_Rmd@~T!2CL&1;v%~(-PITxiq{@U0VR8P{CJsBXtisVS zq!fC`^?AlsYPI!{hY@x-!c+0dolkACpQIZ=pj}B(y6VqdB$HTd=Z+1ww2owTiW%6O zm)c&{GwX3`Dp}MV89wm@&0sy003?_vo%`ytUVRg@eH-xZ8rQt+hQIh3@c_5p_{L&GHLBrdn{jm#>d2f6!(wr;Pf`f1k zU;jP`blpV+bDfQl?N|`C3((nl^)8%eKJb?K3NojDJ@}>fmNiBBd_~{j=*SjUr!j0W zL@6b{Y0RLZQk>pnNn(5OPbfx7@M%+%PW-q!lB}FqW)Rhm>$o@<`SgXF_q{B2bQ3m0 z8dHdL_D%Uad}(($KI+!g&CuY8Q<*iGp&(Q zeI3@)Qx(WB{P-$^zRRFljM`3hxhp;kQWE#D>AhuRUyq^ZH1;JuMYuCZZyb=H$t8UbW2Tj&6aXq-bUYZ)N@Gu@+ z!pP@-$3tC2C%^z}0Nh<=%b9phc8ZMB0)jS+v#hE^etLqK3!lf=A2mDBPAkFptyQz~ zmbDF*+yW7(5Z?NWXe_D}!`s1Rk16pkjxtT>*!Hr|>4j_RM3NC|>7zU}6)J90j#T8H z%NVZS-d?3jM4@#`5eLY!m|(+Mp@JP`d_h8r91(!)bMO%F0sbvIhOSPYFMYMr(vpJK z)53_ci(res@jJ{cjQXg;=jl9+WB7jFkfa#4c=?}G(gqK`YZ*D9+X%BOkI^Z0$JH$K z}eW-5JUv|j1ATmf!V zoi>pynT<05jzrh>FyNdCGR03PPv%b+xhEbZc-1KE&A**k#6Xp>ZK)O#5Hw!bQQkO& zs(pVge$M5U(oi$ohJN4qA)j$gyit*4zz+vmx4Z?kphnilPR%==XvY6w9ZY=89Oj3c zP4X8v-ysLT(J`Z$}!X*H&kyFK>7L89QRlwYW? zbhT*#F&mrMg-_yQ3tM^kO&*#e-Vo?kxGBhs3V76=w^zH6It)ni$vl(6AFaPvWcw@T zm!Rrqkmo2u!y<&F*=&tkG11t=R*=BUUx&PjXb>uyQgQQ|G}$-n-NhTL=?I=B&SjY? zD-6kgw1^0v{V;F%AS7;y=UopDul_Nmi>%LoaIa9tk(~G_`FY!>>??VTv}1X&mCT{r zfzR8*oYoA75e)cisGXktB0U(CEU=8SIDHRSQ0!*Ng*R>ob42xrXgeJYAyh@ND>t)! zNaOa5GI5k>O3$J!l)}jJV`;}knMtwd#F-D<6|v0hD|2#%dW_no8K#X^&DlL22G{wH zv;s&YyL0^#A9QQKZ1AYzVpPwH#nR*4y@i|aVg%p3#lv|Vo2v`ns~b^lL=Sm3I{?=A zko31_)Z{J>Po~!gBS(Iy?n_wg)Oa3(SA&ULKL5N>rryQyJlkD+94Rp;`ex}WEy4M_XTXew-xW$% zmhK!zWN8UwZ-Jlpep+;-XU(G#`WdSgv2uVd{tw zoAuKnlhg+M%2`M$!ly)v@b=YivyVK%3^uGuN4|Im9X<23c&Wf?>pOg_h-`^S&kunP zGU8hwq=Z(zvPQ5IS-Bo+EH-=PgZn8c$R+FEuQN319ITpMu2kYN(WAk$4BDQ{Zrav& zdZy~Tk1p2TNYfdWEa^1Dp4R~tRr>XIZUc8=Ylk!!jknUfcfN()r%RA3c1bT?IL8 zIIzk&LdJ$g}%Vhgm? zwm`KBYf2CnVG3(wPrGD;ue0BWQCSbeWs`0y03yyRLnu+*boQUSzm7dXcX+jvQZ(Za z$y5b8lX^ggUb>h`*8ezVO5stE+|M`Y*=j~Rnj_)LjOEDhmyYR8*`Wkm4qv_f_7=5} zS9fFIG_q^l{IVjs2CK5#IG%*CG-oO;qHFUL=RJ9+HWn=ozd%^1fxXH})s`P$GLf}5 z?&*DYY_>+go>Pf?6HbZnVGktfI%`&E;NT%6q0_W#aiFEYma;CfcpgS-3$zmhH;xP8 z1>X|S8}P#Xvec;D4y1^YV}sS}=$&k-#9Qd*Hbbn<7e_ucpM%H!L zOSD+$1*O)%i=T~zGwt~A z%(yLIgCga->!+KCzav2~r!SuFg;D(e_mgmq0p{wXfQWWy%zQ7I3 zBF?>ri>|G_LYtJy^0XeK!y=HWCa&2xf)Y}k8i%=#)k18px$Twarc*q6F)qLSrCp6!O>dCc9$NupqK5DC$+?rtI-pDE^>*oxCSIV9-Qo}YV*7!l4zdH8Kt7;@o2N;n==u9(&Cajng;H~%fH!hpA zIlL-k-)5oa6r~x@!(-yjO2!kErZ29HWIs}l4huf`91LwKZ_y>TDOA>QN@t^QVeN6be|E^&fhsJNT>o$Hw5N*vW0z5p(!tPVK+ zlYKThp%H?A;bAbxAktr&fYw zSqlX$ufPHHqDCIGbSgP!>m|Kc$hH{O-jK|PDyTvv(=}ePc5JXrw|g#|E9A+H=(2*7 z49#TWg;<&7cXnU7vs#GcX4B4t3$UL=CD@4gmY{gpQ&~s*-3fveX@lG#uPqf8@GPhZ z8N$tpO3{kvK0Zm{**L3K`g4X6G|oL0gFL=@+h#nf-hoS+J5HIGtMO$!EC0Mkf0xB# zWZBgYQv#C)66%fBR6-4)J|NZLzMAPZmzvDCiJkwQ4#D z59zC0J+{kqQXx^iu+3CkM+L#*9m9CST{3 zWl^>Ti^>GXNSsn^IuAe?S4~at#c3M|w||@TL^>!a;B-l;u4zO#aBUbqo-_{-;n2!8rEn)qsm^yO0^8y|84^V0 zOx)?qf`>A=DPPCj!Zi8mAXcX(6)yE<|n>#m|^H^r16aGAz2q zS18)vwVR%YkyAK>u&98};e+jpAL17%##~CJEbxShC++5bilBZlt-{r$!+067A(R2p z_BA3{bsvKDmcz-kXvcgeHW56YFoh&qA?@c$IW|ujhyJp{yUE55tf9BN0P;@w=B*`e zb;Xz>pxpB(0`-8}qD&-(8zWK)Ha=oK9?@fx@PayA7dq?!27o`&AyfB9>N!Ca78aM) zI!7G;ro|4n#@c7^1V4k3q;NuCXW**0{{tz*wy!kO>$(c_11a-kT8>9;ACSE@VnO1& zXML9G^wXNX_R@D30Z|#D=wV&@Tv?=t=?1pwT-{)_B#~oPzRn?aQ4MIc7(P9DW}|K8MLwpup|%1H zl8NYIcHtaU;<0$d%DM0#gt#wV4B}NAjp6OJLiCxku<$%IxtZ7}DLwEfuc0zOX>WhO zR;G|qCvFWYVIVYnD0ih95y*vXAw(n_njG<6o!S7mAlW^`x9-#>Ro>~m^i*v05TM#_ z?)5TT;c)DV8>WjEJ$`^I1P~s$aeN7PpB>i@#>1;aZ$uF!o4p(4rjZ>6Uxq)& zi_nEQ81$;+DUQ2u5Pr8Y(@o?d>qmwI>TYn&heICu^$nt#16KW6F%@~|x3IC3L`R~A zkZYYoCrrg9QS8r?QAh1y<{LL*`RdVQsWQox!}Js*xxx>3lRqSgCxg}ftBebBK=P+x z83TC0W*2Ku#E3w=T#8-4FBNGj;>7aa3zG9^BK60Kcd@`@;;2JduVvyHC+lj$R~Nrk zIYXEe+ST=`mYz^@>AK@toU=mYB%K%y8Y3?okTYizp$qKn?QqekOy)%#JQXhWF&2H5 z^wkx#DjCsvMmC4^e5Fh+nAr%-CCZylq~yIx_#1L{K?I5}=^;h`tHm;=+XG*m=g=9b z^fM3QxON1LhEx&?i7-K-_fHC5d+;LgEZDSzt7iz)NQxH_UPd1f_9s{JVY`3@M(mD6 zo0|^k3L6iE(-&sme8OepJHfqvRb|WbD$ykC622uUkwIX{@a9%k&5&4kyEIT@ULTL{ zTLuJj6!eKRVMr;35xsyfG6??sok1`C11Sm@NoT52B*6JpR4usQH*+koKay5TVS@kF za@7>!BP{~y*KQe~1V!iSNg^SEuT8N0jd;z+7Q#!QlPknDtQ&20x}OV_#LFQqeX(H$ zeEq6pqoasuT+DjOR_PNdM16i692}s4$uDgm_}~B2nE@uv1BK51fc{kt{wJ0dsFd~_^rbfZ zpYT5`uK$E10JWli!vC-S`k(MWOP&9OPyYu0zryFg!~d?$^%HIY6ngsU{r}*TKPz?p z$@FI_t)EPf|C8xIg|+@<`Ln9gPnJet>9D`!`M1W=??ivsAo@x49{+z4{aKOdcfP-C zb^PRWC;5f%XXTFH3H}z>|49H#`71%<&!T33Qv9mY^OE=Yv#B%xLh)aH)j!~WX{-K( zNB#=`Q)%^2nim-GJ@HR_Nmu*X;DBmm{~n_MDH-|)*I$yMKe?oS<@#4Z^f&zf5D)!{ z{{+PUpOoltpo_oN4}XF#*?-eQ`~&!x0^&~~HOK!aJ;dJ$|5m>HN$AVYcY?nawf@2W^R1T;C|dLXsIT=q z*Wcn=Ke@p9|A#2g?^0X8ll?8T^^;8Ef06wwy7fEH-`YSwd6tC!M^OK#6!a&{pK3lY zEdLp2YvJFtef|LcB}?-YxF+&T<}vWo#3a#a5^VB!k(xi*{uEgG$z~|_3)}yHxs^W% z|4QrsNysPj3*rAI`TvgoJ3sv=x<>XF^nbI}e}^~xm52Qk4kQ07{NJqX-wAI1N+|wG z;H&WemR|e^7tWsX%UZ$9Dg9Dk>vy>R@et*iXW@t=gWUm5;aLfU`vz$qLs zMGc%%#S|z|{U_+pUFx5pH`f1xz_%Ubw6XNVN{k6U|93+8;?V&(ds+dW%FV!J_?KEZ zKidoV->aO+FPH0sTnfQM2F&wV#gwfC(98+6R{I8wrvoXXp!MU zZNi|Vip4eZ%v`WIz?rl>xAa zFAoX)Y`+gbDkfyje&i37k4_TGiu<+DVGdb~`8@V(g>SN({4pb(IWM5_=iIm%;q~((~f#_k8;Qo}^g;4z{rE5jc)v!s}%b0YMeZ z^TvN(dHz(0VF~n zuvQyhKm3A>E^2z;{;bdV_TmtWh;}p!WG^c@*uBJA%gg9c0Kd$DKMjEA9`NA`t;*4< zw0*x79%yAKys*TtG$k+peleS6?XRfyWsH-i>f`T^U8`jV%dLu_JujuZ9r+7+zYg6wg`u>7CcejgaKKLU%oaequBZFSoTa@a*Ew3&xU?AFFC*}9keWJ}OFZej-4MuEl ze)P9xfy)6*D^9cux@Qmu)-}A7%)lT4L|^2uhW{CnQSOW_UjZWpR{tf__J$`Cmc^md zxa=3Ze}^s_c*_M;Quuu9tQwiL;e(APv*dhpjEsgGSdE#Pe5Cuj{zawbU-OcG4kQJs rx?v4fgy7-(bt6-?F%WHat#yrG&HmH(0ld03+jd_5LKPTQ>gxX=M*DuZ literal 0 HcmV?d00001 diff --git a/plugins/CuraSolidWorksPlugin/test_files/test.SLDPRT b/plugins/CuraSolidWorksPlugin/test_files/test.SLDPRT new file mode 100644 index 0000000000000000000000000000000000000000..b941ec1f1bfed2ac4c905de0f918ea3ae75997b7 GIT binary patch literal 108224 zcma%h1CS_DvSr)-+P3X}ZQHhO+qP}nwr$(}+P1xK7Jp{`-;KW&Q4u$)Zk@`^dm{7J z$;v-~-v$5x0IAi4UZD1cuY+ks1^@$q01$jQz@i5S0GI*<07wG{06_gaiPbfDWrX?p zSXAX$l=Z$zCDr+vOoSDmfgp>`nxMNW?OS~B&lh-yekQcsGa8Mp41K$g0KHkMaV*=m zZ>qRMNp;>4O~?E{@!_EW0D^!303bjC0I>ez{|EHnfk}$X0`LMTDw$}CXv*{PXG;0o zhWoSyV?%B)YNkGK&{VeWY3$JE0Sc((ai6v$uGBwa-M|0mzmSZkNXBsl-9H*JevLN=h z-Og$HX%&+dBw;;Y-P9KUPw>;fi0^+bfBb9te-jXEkKy-;pM1-jJBE?A{@=NsVsw1A zwH+lUQ8?4m__RbDc>jcz0|5X){tHX~H`f1Rvx$q=YV>h>lgG+Q$G%&;#+MD(Zov6P zq`?_Mg5K;wOL%xD=j#Hs7QP<`7yf{L_CT$DBuaIQ&H~|GSc~{}$>c z7qVs*O*1WF^l#b3l_8IE5j>$KIjW$Akc^Zh78BQtmgeZr@s4tFyq22H?Zhkd=aKbB z^t*xleZguuZ>9i^vp}9O2?S(YetvQbeo)u|0lY}K4e)**i__aH>xn~fS0M8mzSs^_ z>ALV&N$YZ(u+P<4FGJW|x979pa*c;7ASn~=I;wW-T0Yf9^MRH3MKUy|0+7)?Ot5PaKqhO?t#W zr}p<_0lSU)09E`PSh7=Ky9oXSx(Mb|-D7ec7yY`4IV=_pJr2zZve$ShWd6S2w??qe zOlQ$nWE;?Dr0pajqOdQf6pmu2n9REj9Yho;4`iiLOo$6?P&EN8KH`@HBl+d7YEgO1 zq~J#a$Bm>`J+)=^G+nAXhKibx% z0&V)|=Jw^f6ekgMgK4^tc^$NpsiOG%26)CXPBSd)8{UgM)o>Z$78Rt70;Uj<;±lvkRT2#h{ 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

WC^V`cmc7ZSwaIb#+l^q2v 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 z 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 Date: Thu, 27 Jul 2017 12:55:12 +0200 Subject: [PATCH 376/379] Added min width & height FIXES #600 --- plugins/USBPrinting/FirmwareUpdateWindow.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml index b42cff114f..f55aa4c56e 100644 --- a/plugins/USBPrinting/FirmwareUpdateWindow.qml +++ b/plugins/USBPrinting/FirmwareUpdateWindow.qml @@ -12,7 +12,9 @@ UM.Dialog id: base; width: 500 * Screen.devicePixelRatio; + minimumWidth: 500 * Screen.devicePixelRatio; height: 100 * Screen.devicePixelRatio; + minimumHeight: 100 * Screen.devicePixelRatio; visible: true; modality: Qt.ApplicationModal; From ddaac2fbbc481984daefd36507874d91949b7a78 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Jul 2017 13:02:49 +0200 Subject: [PATCH 377/379] Revert "Add SolidWorks plugin" This reverts commit 1c39c90494a664fafdfdd127ace578bd274b19eb. --- plugins/CuraSolidWorksPlugin/CMakeLists.txt | 11 - .../CuraSolidWorksPlugin/CommonComReader.py | 200 ------ plugins/CuraSolidWorksPlugin/ConfigDialog.py | 38 - plugins/CuraSolidWorksPlugin/ConfigDialog.qml | 112 --- plugins/CuraSolidWorksPlugin/ExportSTLUI.qml | 107 --- plugins/CuraSolidWorksPlugin/LICENSE | 661 ------------------ .../SolidWorksConstants.py | 45 -- .../CuraSolidWorksPlugin/SolidWorksReader.py | 231 ------ .../SolidWorksReaderUI.py | 95 --- plugins/CuraSolidWorksPlugin/__init__.py | 58 -- plugins/CuraSolidWorksPlugin/plugin.json | 8 - .../test_files/test.SLDASM | Bin 37454 -> 0 bytes .../test_files/test.SLDPRT | Bin 108224 -> 0 bytes 13 files changed, 1566 deletions(-) delete mode 100644 plugins/CuraSolidWorksPlugin/CMakeLists.txt delete mode 100644 plugins/CuraSolidWorksPlugin/CommonComReader.py delete mode 100644 plugins/CuraSolidWorksPlugin/ConfigDialog.py delete mode 100644 plugins/CuraSolidWorksPlugin/ConfigDialog.qml delete mode 100644 plugins/CuraSolidWorksPlugin/ExportSTLUI.qml delete mode 100644 plugins/CuraSolidWorksPlugin/LICENSE delete mode 100644 plugins/CuraSolidWorksPlugin/SolidWorksConstants.py delete mode 100644 plugins/CuraSolidWorksPlugin/SolidWorksReader.py delete mode 100644 plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py delete mode 100644 plugins/CuraSolidWorksPlugin/__init__.py delete mode 100644 plugins/CuraSolidWorksPlugin/plugin.json delete mode 100644 plugins/CuraSolidWorksPlugin/test_files/test.SLDASM delete mode 100644 plugins/CuraSolidWorksPlugin/test_files/test.SLDPRT diff --git a/plugins/CuraSolidWorksPlugin/CMakeLists.txt b/plugins/CuraSolidWorksPlugin/CMakeLists.txt deleted file mode 100644 index b4d7f32b73..0000000000 --- a/plugins/CuraSolidWorksPlugin/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -project(CuraSolidWorksIntegrationPlugin NONE) -cmake_minimum_required(VERSION 2.8.12) - -install(FILES - __init__.py - CommonComReader.py - SolidWorksConstants.py - SolidWorksReader.py - LICENSE - DESTINATION lib/cura/plugins/CuraSolidWorksIntegrationPlugin -) \ No newline at end of file diff --git a/plugins/CuraSolidWorksPlugin/CommonComReader.py b/plugins/CuraSolidWorksPlugin/CommonComReader.py deleted file mode 100644 index 02665224a5..0000000000 --- a/plugins/CuraSolidWorksPlugin/CommonComReader.py +++ /dev/null @@ -1,200 +0,0 @@ -# Copyright (c) 2017 Thomas Karl Pietrowski - -# Buildins -import os -import tempfile - -# Uranium/Cura -from UM.Application import Application -from UM.i18n import i18nCatalog -i18n_catalog = i18nCatalog("CuraSolidWorksIntegrationPlugin") -from UM.Message import Message -from UM.Logger import Logger -from UM.Mesh.MeshReader import MeshReader -from UM.PluginRegistry import PluginRegistry -from UM.Scene.SceneNode import SceneNode - -# PyWin32 -from comtypes.client import GetClassObject - - -class CommonCOMReader(MeshReader): - def __init__(self, app_name, app_friendly_name): - super().__init__() - self._app_name = app_name - self._app_friendly_name = app_friendly_name - - # Start/stop behaviour - - # Technically neither preloading nor keeping the instance up, is possible, since Cura calls the file reader from different/new threads - # The error when trying to use it here is: - # > pywintypes.com_error: (-2147417842, 'The application called an interface that was marshalled for a different thread.', None, None) - self._app_preload = False - self._app_keep_running = False - - """ - if self._app_preload and not self._app_keep_running: - self._app_keep_running = True - """ - - # Preparations - """ - if self._app_preload: - Logger.log("d", "Preloading %s..." %(self._app_friendlyName)) - self.startApp() - """ - - Logger.log("d", "Looking for readers...") - self.__init_builtin_readers__() - - def __init_builtin_readers__(self): - self._file_formats_first_choice = [] # Ordered list of preferred formats - self._reader_for_file_format = {} - - # Trying 3MF first because it describes the model much better.. - # However, this is untested since this plugin was only tested with STL support - if PluginRegistry.getInstance().isActivePlugin("3MFReader"): - self._reader_for_file_format["3mf"] = PluginRegistry.getInstance().getPluginObject("3MFReader") - self._file_formats_first_choice.append("3mf") - - if PluginRegistry.getInstance().isActivePlugin("STLReader"): - self._reader_for_file_format["stl"] = PluginRegistry.getInstance().getPluginObject("STLReader") - self._file_formats_first_choice.append("stl") - - if not len(self._reader_for_file_format): - Logger.log("d", "Could not find any reader for (probably) supported file formats!") - - def getSaveTempfileName(self, suffix = ""): - # Only get a save name for a temp_file here... - temp_stl_file = tempfile.NamedTemporaryFile() - temp_stl_file_name = "%s%s" % (temp_stl_file.name, suffix) - temp_stl_file.close() - - return temp_stl_file_name - - def startApp(self, visible = False): - Logger.log("d", "Starting %s...", self._app_friendly_name) - - com_class_object = GetClassObject(self._app_name) - com_instance = com_class_object.CreateInstance() - - return com_instance - - def checkApp(self): - raise NotImplementedError("Checking app is not implemented!") - - def getAppVisible(self, state): - raise NotImplementedError("Toggle for visibility not implemented!") - - def setAppVisible(self, state, **options): - raise NotImplementedError("Toggle for visibility not implemented!") - - def closeApp(self, **options): - raise NotImplementedError("Procedure how to close your app is not implemented!") - - def openForeignFile(self, **options): - "This function shall return options again. It optionally contains other data, which is needed by the reader for other tasks later." - raise NotImplementedError("Opening files is not implemented!") - - def exportFileAs(self, model, **options): - raise NotImplementedError("Exporting files is not implemented!") - - def closeForeignFile(self, **options): - raise NotImplementedError("Closing files is not implemented!") - - def nodePostProcessing(self, node): - return node - - def read(self, file_path): - options = {"foreignFile": file_path, - "foreignFormat": os.path.splitext(file_path)[1], - } - - # Starting app, if needed - try: - options["app_instance"] = self.startApp() - except Exception: - Logger.logException("e", "Failed to start <%s>...", self._app_name) - error_message = Message(i18n_catalog.i18nc("@info:status", "Error while starting %s!" % self._app_friendly_name)) - error_message.show() - return None - - # Tell the 3rd party application to open a file... - Logger.log("d", "Opening file with %s..." % self._app_friendly_name) - options = self.openForeignFile(**options) - - # Append all formats which are not preferred to the end of the list - fileFormats = self._file_formats_first_choice - for file_format in self._reader_for_file_format.keys(): - if file_format not in fileFormats: - fileFormats.append(file_format) - - # Trying to convert into all formats 1 by 1 and continue with the successful export - Logger.log("i", "Trying to convert into: %s", fileFormats) - for file_format in fileFormats: - Logger.log("d", "Trying to convert <%s> into '%s'", file_path, file_format) - - options["tempType"] = file_format - - options["tempFile"] = self.getSaveTempfileName(".%s" % file_format.upper()) - Logger.log("d", "Using temporary file <%s>", options["tempFile"]) - - # In case there is already a file with this name (very unlikely...) - if os.path.isfile(options["tempFile"]): - Logger.log("w", "Removing already available file, called: %s", options["tempFile"]) - os.remove(options["tempFile"]) - - Logger.log("d", "Saving as: <%s>", options["tempFile"]) - try: - self.exportFileAs(**options) - except: - Logger.logException("e", "Could not export <%s> into '%s'.", file_path, file_format) - continue - - if os.path.isfile(options["tempFile"]): - Logger.log("d", "Saved as: <%s>", options["tempFile"]) - else: - Logger.log("d", "Temporary file not found after export!") - continue - - # Opening the resulting file in Cura - try: - #reader = self._readerForFileformat[fileFormat] - reader = Application.getInstance().getMeshFileHandler().getReaderForFile(options["tempFile"]) - if not reader: - Logger.log("d", "Found no reader for %s. That's strange...") - continue - Logger.log("d", "Using reader: %s", reader.getPluginId()) - temp_scene_node = reader.read(options["tempFile"]) - except: - Logger.logException("e", "Failed to open exported <%s> file in Cura!", file_format) - continue - - # Remove the temp_file again - Logger.log("d", "Removing temporary STL file, called <%s>", options["tempFile"]) - os.remove(options["tempFile"]) - - break - - # Closing document in the app - self.closeForeignFile(**options) - - # Closing the app again.. - self.closeApp(**options) - - scene_node = SceneNode() - temp_scene_node = self.nodePostProcessing(temp_scene_node) - mesh = temp_scene_node.getMeshDataTransformed() - - # When using 3MF as the format to convert into we get an list of meshes instead of only one mesh directly. - # This is a little workaround since reloading of 3MF files doesn't work at the moment. - if type(mesh) == list: - error_message = Message(i18n_catalog.i18nc("@info:status", "Please keep in mind, that you have to reopen your SolidWorks file manually! Reloading the model won't work!")) - error_message.show() - mesh = mesh.set(file_name = None) - else: - mesh = mesh.set(file_name = file_path) - scene_node.setMeshData(mesh) - - if scene_node: - return scene_node diff --git a/plugins/CuraSolidWorksPlugin/ConfigDialog.py b/plugins/CuraSolidWorksPlugin/ConfigDialog.py deleted file mode 100644 index 18f2c0c768..0000000000 --- a/plugins/CuraSolidWorksPlugin/ConfigDialog.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# PluginBrowser is released under the terms of the AGPLv3 or higher. -from UM.Extension import Extension -from UM.i18n import i18nCatalog -from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry -from UM.Application import Application - -from PyQt5.QtCore import QUrl, QObject, pyqtSignal -from PyQt5.QtQml import QQmlComponent, QQmlContext - -import os - -i18n_catalog = i18nCatalog("cura") - - -class ConfigDialog(QObject, Extension): - def __init__(self, parent = None): - super().__init__(parent) - self._dialog = None - self.addMenuItem(i18n_catalog.i18n("Configure"), self._openConfigDialog) - - def _openConfigDialog(self): - if not self._dialog: - self._createDialog() - self._dialog.show() - - def _createDialog(self): - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ConfigDialog.qml")) - self._qml_component = QQmlComponent(Application.getInstance()._engine, path) - - # We need access to engine (although technically we can't) - self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._qml_context.setContextProperty("manager", self) - self._dialog = self._qml_component.create(self._qml_context) - if self._dialog is None: - Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) - Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) diff --git a/plugins/CuraSolidWorksPlugin/ConfigDialog.qml b/plugins/CuraSolidWorksPlugin/ConfigDialog.qml deleted file mode 100644 index 1616e9466e..0000000000 --- a/plugins/CuraSolidWorksPlugin/ConfigDialog.qml +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.1 -import QtQuick.Controls 1.1 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -UM.Dialog -{ - width: 300 * Screen.devicePixelRatio - minimumWidth: 300 * Screen.devicePixelRatio - - height: 100 * Screen.devicePixelRatio - minimumHeight: 100 * Screen.devicePixelRatio - - title: catalog.i18nc("@title:window", "Cura SolidWorks Plugin Configuration") - - onVisibilityChanged: - { - if (visible) - { - choiceDropdown.updateCurrentIndex(); - } - } - - GridLayout - { - UM.I18nCatalog{id: catalog; name: "cura"} - anchors.fill: parent - Layout.fillWidth: true - columnSpacing: 16 - rowSpacing: 10 - columns: 1 - - Row - { - width: parent.width - - Label { - text: catalog.i18nc("@action:label", "Default quality of the exported STL:") - width: 150 - anchors.verticalCenter: parent.verticalCenter - } - } - - Row - { - ComboBox - { - id: choiceDropdown - - currentIndex: updateCurrentIndex() - - function updateCurrentIndex() - { - var index = 0; - var currentChoice = UM.Preferences.getValue("cura_solidworks/choice_on_exporting_stl_quality"); - for (var i = 0; i < model.count; ++i) - { - if (model.get(i).code == currentChoice) - { - index = i; - break; - } - } - currentIndex = index; - } - - model: ListModel - { - id: choiceModel - - Component.onCompleted: - { - append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Always ask"), code: "always_ask" }); - append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Always use Fine quality"), code: "always_use_fine" }); - append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Always use Coarse quality"), code: "always_use_coarse" }); - } - } - } - } - } - - rightButtons: [ - Button - { - id: ok_button - text: catalog.i18nc("@action:button", "OK") - onClicked: - { - UM.Preferences.setValue("cura_solidworks/choice_on_exporting_stl_quality", - choiceModel.get(choiceDropdown.currentIndex).code); - close(); - } - enabled: true - }, - Button - { - id: cancel_button - text: catalog.i18nc("@action:button", "Cancel") - onClicked: - { - close(); - } - enabled: true - } - ] -} diff --git a/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml b/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml deleted file mode 100644 index 5d307250f9..0000000000 --- a/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.1 -import QtQuick.Controls 1.1 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -UM.Dialog -{ - width: 300 * Screen.devicePixelRatio; - minimumWidth: 300 * Screen.devicePixelRatio; - - height: 100 * Screen.devicePixelRatio; - minimumHeight: 100 * Screen.devicePixelRatio; - - title: catalog.i18nc("@title:window", "Import SolidWorks File as STL...") - - onVisibilityChanged: - { - if (visible) - { - qualityDropdown.currentIndex = 1; - rememberChoiceCheckBox.checked = UM.Preferences.getValue("cura_solidworks/choice_on_exporting_stl_quality") != "always_ask"; - } - } - - GridLayout - { - UM.I18nCatalog{id: catalog; name: "cura"} - anchors.fill: parent; - Layout.fillWidth: true - columnSpacing: 16 - rowSpacing: 4 - columns: 1 - - UM.TooltipArea { - Layout.fillWidth:true - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Quality of the Exported STL") - Row { - width: parent.width - - Label { - text: catalog.i18nc("@action:label", "Quality") - width: 100 - anchors.verticalCenter: parent.verticalCenter - } - - ComboBox - { - id: qualityDropdown - model: ListModel - { - id: qualityModel - - Component.onCompleted: - { - append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Coarse"), code: "coarse" }); - append({ text: catalog.i18nc("@option:curaSolidworksStlQuality", "Fine"), code: "fine" }); - } - } - currentIndex: 1 - } - } - } - - Row - { - width: parent.width - - CheckBox - { - id: rememberChoiceCheckBox - text: catalog.i18nc("@text:window", "Remember my choice") - checked: UM.Preferences.getValue("cura_solidworks/choice_on_exporting_stl_quality") != "always_ask" - } - } - } - - rightButtons: [ - Button - { - id: ok_button - text: catalog.i18nc("@action:button", "OK") - onClicked: - { - manager.setQuality(qualityModel.get(qualityDropdown.currentIndex).code, rememberChoiceCheckBox.checked); - manager.onOkButtonClicked(); - } - enabled: true - }, - Button - { - id: cancel_button - text: catalog.i18nc("@action:button", "Cancel") - onClicked: - { - manager.onCancelButtonClicked(); - } - enabled: true - } - ] -} diff --git a/plugins/CuraSolidWorksPlugin/LICENSE b/plugins/CuraSolidWorksPlugin/LICENSE deleted file mode 100644 index dbbe355815..0000000000 --- a/plugins/CuraSolidWorksPlugin/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/plugins/CuraSolidWorksPlugin/SolidWorksConstants.py b/plugins/CuraSolidWorksPlugin/SolidWorksConstants.py deleted file mode 100644 index 016e17da2f..0000000000 --- a/plugins/CuraSolidWorksPlugin/SolidWorksConstants.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2017 Thomas Karl Pietrowski - - -class SolidWorksEnums: - class swUserPreferenceToggle_e: - swSTLBinaryFormat = 69 - - class swDocumentTypes_e: - swDocNONE = 0 - swDocPART = 1 - swDocASSEMBLY = 2 - swDocDRAWING = 3 - - class FileTypes: - # Enums to open files - SWpart = 1 - SWassembly = 2 - SWdrawing = 3 - - swSTLQuality = 78 - - class swLengthUnit_e: - swMM = 0 - swCM = 1 - swMETER = 2 - swINCHES = 3 - swFEET = 4 - swFEETINCHES = 5 - swANGSTROM = 6 - swNANOMETER = 7 - swMICRON = 8 - swMIL = 9 - swUIN = 10 - - class swUserPreferenceIntegerValue_e: - swExportSTLQuality = 78 - swExportStlUnits = 211 - - class swSTLQuality_e: - swSTLQuality_Coarse = 1 - swSTLQuality_Fine = 2 - swSTLQuality_Custom = 3 - - class UserPreferences: - swSTLComponentsIntoOneFile = 72 diff --git a/plugins/CuraSolidWorksPlugin/SolidWorksReader.py b/plugins/CuraSolidWorksPlugin/SolidWorksReader.py deleted file mode 100644 index 6a194187ff..0000000000 --- a/plugins/CuraSolidWorksPlugin/SolidWorksReader.py +++ /dev/null @@ -1,231 +0,0 @@ -# Copyright (c) 2017 Thomas Karl Pietrowski - -# TODOs: -# * Adding selection to separately import parts from an assembly - -# Buildings -import math - -# Uranium/Cura -from UM.i18n import i18nCatalog -from UM.Message import Message -from UM.Logger import Logger -from UM.Math.Vector import Vector -from UM.Math.Quaternion import Quaternion -from UM.Mesh.MeshReader import MeshReader - -# Our plugin -from .CommonComReader import CommonCOMReader -from .SolidWorksConstants import SolidWorksEnums -from .SolidWorksReaderUI import SolidWorksReaderUI - -i18n_catalog = i18nCatalog("CuraSolidWorksIntegrationPlugin") - - -class SolidWorksReader(CommonCOMReader): - def __init__(self): - super().__init__("SldWorks.Application", "SolidWorks") - - self._extension_part = ".SLDPRT" - self._extension_assembly = ".SLDASM" - self._supported_extensions = [self._extension_part.lower(), - self._extension_assembly.lower(), - ] - - self._convert_assembly_into_once = True # False is not implemented now! - self._file_formats_first_choice = [] - self._revision = None - self._revision_major = None - self._revision_minor = None - self._revision_patch = None - - self._ui = SolidWorksReaderUI() - self._selected_quality = None - self._quality_value_map = {"coarse": SolidWorksEnums.swSTLQuality_e.swSTLQuality_Coarse, - "find": SolidWorksEnums.swSTLQuality_e.swSTLQuality_Fine} - - self.root_component = None - - def preRead(self, file_name, *args, **kwargs): - self._ui.showConfigUI() - self._ui.waitForUIToClose() - - if self._ui.getCancelled(): - return MeshReader.PreReadResult.cancelled - - # get quality - self._selected_quality = self._ui.quality - if self._selected_quality is None: - self._selected_quality = "fine" - self._selected_quality = self._selected_quality.lower() - - # give actual value for quality - self._selected_quality = self._quality_value_map.get(self._selected_quality, - SolidWorksEnums.swSTLQuality_e.swSTLQuality_Fine) - - return MeshReader.PreReadResult.accepted - - def setAppVisible(self, state, **options): - options["app_instance"].Visible = state - - def getAppVisible(self, state, **options): - return options["app_instance"].Visible - - def startApp(self, visible=False): - app_instance = super().startApp(visible = visible) - - # Getting revision after starting - revision_number = app_instance.RevisionNumber() - Logger.log("d", "SolidWorks RevisionNumber: %s", revision_number) - self._revision = [int(x) for x in revision_number.split(".")] - self._revision_major = self._revision[0] - self._revision_minor = self._revision[1] - self._revision_patch = self._revision[2] - - # Re-generate a list of preferred file formats - self.updateFormatsFirstChoise() - - return app_instance - - def updateFormatsFirstChoise(self): - self._file_formats_first_choice = ["stl"] - if self._revision_major >= 25 and "3mf" in self._reader_for_file_format.keys(): - self._file_formats_first_choice.insert(0, "3mf") - - return self._file_formats_first_choice - - def checkApp(self, **options): - functions_to_be_checked = ("OpenDoc", "CloseDoc") - for func in functions_to_be_checked: - try: - getattr(options["app_instance"], func) - except: - Logger.logException("e", "Error which occurred when checking for a valid app instance") - return False - return True - - def closeApp(self, **options): - if "app_instance" in options.keys(): - del options["app_instance"] - - def walkComponentsInAssembly(self, root = None): - if root is None: - root = self.root_component - - children = root.GetChildren - - if children: - children = [self.walkComponentsInAssembly(child) for child in children] - return root, children - else: - return root - - """ - models = options["sw_model"].GetComponents(True) - - for model in models: - #Logger.log("d", model.GetModelDoc2()) - #Logger.log("d", repr(model.GetTitle)) - Logger.log("d", repr(model.GetPathName)) - #Logger.log("d", repr(model.GetType)) - if model.GetPathName in ComponentsCount.keys(): - ComponentsCount[model.GetPathName] = ComponentsCount[model.GetPathName] + 1 - else: - ComponentsCount[model.GetPathName] = 1 - - for key in ComponentsCount.keys(): - Logger.log("d", "Found %s %s-times in the assembly!" %(key, ComponentsCount[key])) - """ - - def openForeignFile(self, **options): - if options["foreignFormat"].upper() == self._extension_part: - filetype = SolidWorksEnums.FileTypes.SWpart - elif options["foreignFormat"].upper() == self._extension_assembly: - filetype = SolidWorksEnums.FileTypes.SWassembly - else: - raise NotImplementedError("Unknown extension. Something went terribly wrong!") - - #options["sw_model"] = options["app_instance"].OpenDoc(options["foreignFile"], filetype) - documentSpecification = options["app_instance"].GetOpenDocSpec(options["foreignFile"]) - - ## NOTE: SPEC: FileName - #documentSpecification.FileName - - ## NOTE: SPEC: DocumentType - ## TODO: Really needed here?! - documentSpecification.DocumentType = filetype - - ## TODO: Test the impact of LightWeight = True - #documentSpecification.LightWeight = True - documentSpecification.Silent = True - - ## TODO: Double check, whether file was really opened read-only.. - documentSpecification.ReadOnly = True - - options["sw_model"] = options["app_instance"].OpenDoc7(documentSpecification._comobj) - - if documentSpecification.Warning: - Logger.log("w", "Warnings happened while opening your SolidWorks file!") - if documentSpecification.Error: - Logger.log("e", "Errors happened while opening your SolidWorks file!") - error_message = Message(i18n_catalog.i18nc("@info:status", "Errors appeared while opening your SolidWorks file! \ - Please check, whether it is possible to open your file in SolidWorks itself without any problems as well!" % (self._app_friendly_name))) - error_message.show() - - # Might be useful in the future, but no need for this ATM - #self.configuration = self.model.getActiveConfiguration - #self.root_component = self.configuration.GetRootComponent - - ## EXPERIMENTAL: Browse single parts in assembly - #if filetype == SolidWorksEnums.FileTypes.SWassembly: - # Logger.log("d", 'walkComponentsInAssembly: ' + repr(self.walkComponentsInAssembly())) - - return options - - def exportFileAs(self, **options): - if options["tempType"] == "stl": - if options["foreignFormat"].upper() == self._extension_assembly: - # Backing up current setting of swSTLComponentsIntoOneFile - swSTLComponentsIntoOneFileBackup = options["app_instance"].GetUserPreferenceToggle(SolidWorksEnums.UserPreferences.swSTLComponentsIntoOneFile) - options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.UserPreferences.swSTLComponentsIntoOneFile, self._convert_assembly_into_once) - - swExportSTLQualityBackup = options["app_instance"].GetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportSTLQuality) - options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportSTLQuality, SolidWorksEnums.swSTLQuality_e.swSTLQuality_Fine) - - # Changing the default unit for STLs to mm, which is expected by Cura - swExportStlUnitsBackup = options["app_instance"].GetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportStlUnits) - options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportStlUnits, SolidWorksEnums.swLengthUnit_e.swMM) - - # Changing the output type temporary to binary - swSTLBinaryFormatBackup = options["app_instance"].GetUserPreferenceToggle(SolidWorksEnums.swUserPreferenceToggle_e.swSTLBinaryFormat) - options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.swUserPreferenceToggle_e.swSTLBinaryFormat, True) - - options["sw_model"].SaveAs(options["tempFile"]) - - if options["tempType"] == "stl": - # Restoring swSTLBinaryFormat - options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.swUserPreferenceToggle_e.swSTLBinaryFormat, swSTLBinaryFormatBackup) - - # Restoring swExportStlUnits - options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportStlUnits, swExportStlUnitsBackup) - - # Restoring swSTLQuality_Fine - options["app_instance"].SetUserPreferenceIntegerValue(SolidWorksEnums.swUserPreferenceIntegerValue_e.swExportSTLQuality, swExportSTLQualityBackup) - - if options["foreignFormat"].upper() == self._extension_assembly: - # Restoring swSTLComponentsIntoOneFile - options["app_instance"].SetUserPreferenceToggle(SolidWorksEnums.UserPreferences.swSTLComponentsIntoOneFile, swSTLComponentsIntoOneFileBackup) - - def closeForeignFile(self, **options): - options["app_instance"].CloseDoc(options["foreignFile"]) - - def areReadersAvailable(self): - return bool(self._reader_for_file_format) - - def nodePostProcessing(self, node): - if self._revision_major == 24: # Known problem under SolidWorks 2016: Exported models are rotated by -90 degrees. This rotates it back! - rotation = Quaternion.fromAngleAxis(math.radians(90), Vector.Unit_X) - node.rotate(rotation) - return node - - ## Decide if we need to use ascii or binary in order to read file diff --git a/plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py b/plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py deleted file mode 100644 index 78f6c3dc0d..0000000000 --- a/plugins/CuraSolidWorksPlugin/SolidWorksReaderUI.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the AGPLv3 or higher. - -import os -import threading - -from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QObject -from PyQt5.QtQml import QQmlComponent, QQmlContext - -from UM.FlameProfiler import pyqtSlot -from UM.Application import Application -from UM.PluginRegistry import PluginRegistry - -from UM.i18n import i18nCatalog - -from UM.Preferences import Preferences - -catalog = i18nCatalog("cura") - - -class SolidWorksReaderUI(QObject): - show_config_ui_trigger = pyqtSignal() - - def __init__(self): - super().__init__() - - Preferences.getInstance().addPreference("cura_solidworks/choice_on_exporting_stl_quality", "always_ask") - - self._cancelled = False - self._ui_view = None - self.show_config_ui_trigger.connect(self._onShowConfigUI) - - self.quality = None - - self._ui_lock = threading.Lock() - - def getCancelled(self): - return self._cancelled - - def waitForUIToClose(self): - self._ui_lock.acquire() - self._ui_lock.release() - - def showConfigUI(self): - preference = Preferences.getInstance().getValue("cura_solidworks/choice_on_exporting_stl_quality") - if preference != "always_ask": - if preference == "always_use_fine": - self.quality = "fine" - elif preference == "always_use_coarse": - self.quality = "coarse" - else: - self.quality = "fine" - return - - self._ui_lock.acquire() - self._cancelled = False - self.show_config_ui_trigger.emit() - - @pyqtSlot(str, bool) - def setQuality(self, quality, remember_my_choice): - self.quality = quality - if not remember_my_choice: - Preferences.getInstance().setValue("cura_solidworks/choice_on_exporting_stl_quality", "always_ask") - else: - choice = "always_use_fine" - if quality == "coarse": - choice = "always_use_coarse" - Preferences.getInstance().setValue("cura_solidworks/choice_on_exporting_stl_quality", choice) - - def _onShowConfigUI(self): - if self._ui_view is None: - self._createConfigUI() - self._ui_view.show() - - def _createConfigUI(self): - if self._ui_view is None: - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("CuraSolidWorksPlugin"), "ExportSTLUI.qml")) - component = QQmlComponent(Application.getInstance()._engine, path) - self._ui_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._ui_context.setContextProperty("manager", self) - self._ui_view = component.create(self._ui_context) - - self._ui_view.setFlags(self._ui_view.flags() & ~Qt.WindowCloseButtonHint & ~Qt.WindowMinimizeButtonHint & ~Qt.WindowMaximizeButtonHint) - - @pyqtSlot() - def onOkButtonClicked(self): - self._cancelled = False - self._ui_view.close() - self._ui_lock.release() - - @pyqtSlot() - def onCancelButtonClicked(self): - self._cancelled = True - self._ui_view.close() - self._ui_lock.release() diff --git a/plugins/CuraSolidWorksPlugin/__init__.py b/plugins/CuraSolidWorksPlugin/__init__.py deleted file mode 100644 index f1a7e74959..0000000000 --- a/plugins/CuraSolidWorksPlugin/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) 2016 Thomas Karl Pietrowski - -# TODO: Adding support for basic CATIA support - -from UM.Platform import Platform - -from UM.i18n import i18nCatalog -i18n_catalog = i18nCatalog("CuraSolidWorksIntegrationPlugin") - -if Platform.isWindows(): - # For installation check - import winreg - # The reader plugin itself - from . import SolidWorksReader - - def is_SolidWorks_available(): - try: - # Could find a better key to detect whether SolidWorks is installed.. - winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, "SldWorks.Application") - return True - except: - return False - - -def getMetaData(): - return { - "mesh_reader": - [ - { - "extension": "SLDPRT", - "description": i18n_catalog.i18nc("@item:inlistbox", "SolidWorks part file") - }, - { - "extension": "SLDASM", - "description": i18n_catalog.i18nc("@item:inlistbox", "SolidWorks assembly file") - } - ] - } - - # TODO: - # Needs more documentation on how to convert a CATproduct in CATIA using COM API - # - #{ - # "extension": "CATProduct", - # "description": i18n_catalog.i18nc("@item:inlistbox", "CATproduct file") - #} - - -def register(app): - # Solid works only runs on Windows. - plugin_data = {} - if Platform.isWindows(): - reader = SolidWorksReader.SolidWorksReader() - if is_SolidWorks_available() and reader.areReadersAvailable(): - plugin_data["mesh_reader"] = reader - from .ConfigDialog import ConfigDialog - plugin_data["extension"] = ConfigDialog() - return plugin_data diff --git a/plugins/CuraSolidWorksPlugin/plugin.json b/plugins/CuraSolidWorksPlugin/plugin.json deleted file mode 100644 index 948772029b..0000000000 --- a/plugins/CuraSolidWorksPlugin/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "SolidWorks Integration", - "author": "Thomas Karl Pietrowski", - "version": "0.1.1", - "description": "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura", - "api": 4, - "i18n-catalog": "cura" -} \ No newline at end of file diff --git a/plugins/CuraSolidWorksPlugin/test_files/test.SLDASM b/plugins/CuraSolidWorksPlugin/test_files/test.SLDASM deleted file mode 100644 index d6e85042d449efab6c76d86fd802d237c77e7e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37454 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 diff --git a/plugins/CuraSolidWorksPlugin/test_files/test.SLDPRT b/plugins/CuraSolidWorksPlugin/test_files/test.SLDPRT deleted file mode 100644 index b941ec1f1bfed2ac4c905de0f918ea3ae75997b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108224 zcma%h1CS_DvSr)-+P3X}ZQHhO+qP}nwr$(}+P1xK7Jp{`-;KW&Q4u$)Zk@`^dm{7J z$;v-~-v$5x0IAi4UZD1cuY+ks1^@$q01$jQz@i5S0GI*<07wG{06_gaiPbfDWrX?p zSXAX$l=Z$zCDr+vOoSDmfgp>`nxMNW?OS~B&lh-yekQcsGa8Mp41K$g0KHkMaV*=m zZ>qRMNp;>4O~?E{@!_EW0D^!303bjC0I>ez{|EHnfk}$X0`LMTDw$}CXv*{PXG;0o zhWoSyV?%B)YNkGK&{VeWY3$JE0Sc((ai6v$uGBwa-M|0mzmSZkNXBsl-9H*JevLN=h z-Og$HX%&+dBw;;Y-P9KUPw>;fi0^+bfBb9te-jXEkKy-;pM1-jJBE?A{@=NsVsw1A zwH+lUQ8?4m__RbDc>jcz0|5X){tHX~H`f1Rvx$q=YV>h>lgG+Q$G%&;#+MD(Zov6P zq`?_Mg5K;wOL%xD=j#Hs7QP<`7yf{L_CT$DBuaIQ&H~|GSc~{}$>c z7qVs*O*1WF^l#b3l_8IE5j>$KIjW$Akc^Zh78BQtmgeZr@s4tFyq22H?Zhkd=aKbB z^t*xleZguuZ>9i^vp}9O2?S(YetvQbeo)u|0lY}K4e)**i__aH>xn~fS0M8mzSs^_ z>ALV&N$YZ(u+P<4FGJW|x979pa*c;7ASn~=I;wW-T0Yf9^MRH3MKUy|0+7)?Ot5PaKqhO?t#W zr}p<_0lSU)09E`PSh7=Ky9oXSx(Mb|-D7ec7yY`4IV=_pJr2zZve$ShWd6S2w??qe zOlQ$nWE;?Dr0pajqOdQf6pmu2n9REj9Yho;4`iiLOo$6?P&EN8KH`@HBl+d7YEgO1 zq~J#a$Bm>`J+)=^G+nAXhKibx% z0&V)|=Jw^f6ekgMgK4^tc^$NpsiOG%26)CXPBSd)8{UgM)o>Z$78Rt70;Uj<;±lvkRT2#h{ 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

WC^V`cmc7ZSwaIb#+l^q2v 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 z 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 Date: Thu, 27 Jul 2017 17:05:02 +0200 Subject: [PATCH 378/379] fix: don't enable Roffing by default --- 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 7d499d6e9c..102e02653a 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -968,7 +968,7 @@ "minimum_value": "0", "maximum_value_warning": "top_layers - 1", "type": "int", - "value": "0 if infill_sparse_density == 100 else 1", + "value": "0", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, "enabled": "top_layers > 0" From d052511be526180696a846fa623083cbd9398f33 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 27 Jul 2017 17:11:56 +0200 Subject: [PATCH 379/379] rename: Top Surface Infill ==> Top Surface Skin --- resources/definitions/fdmprinter.def.json | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 102e02653a..87cf225463 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -701,7 +701,7 @@ }, "roofing_line_width": { - "label": "Top Surface Infill Line Width", + "label": "Top Surface Skin Line Width", "description": "Width of a single line of the areas at the top of the print.", "unit": "mm", "minimum_value": "0.001", @@ -949,7 +949,7 @@ }, "roofing_extruder_nr": { - "label": "Top Surface Infill Extruder", + "label": "Top Surface Skin Extruder", "description": "The extruder train used for printing the top most skin. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", @@ -962,7 +962,7 @@ }, "roofing_layer_count": { - "label": "Top Surface Infill Layers", + "label": "Top Surface Skin Layers", "description": "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces.", "default_value": 0, "minimum_value": "0", @@ -975,7 +975,7 @@ }, "roofing_pattern": { - "label": "Top Surface Infill Pattern", + "label": "Top Surface Skin Pattern", "description": "The pattern of the top most layers.", "type": "enum", "options": @@ -992,8 +992,8 @@ }, "roofing_angles": { - "label": "Top Surface Infill Line Directions", - "description": "A list of integer line directions to use when the top surface infill layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", + "label": "Top Surface Skin Line Directions", + "description": "A list of integer line directions to use when the top surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", "type": "[int]", "default_value": "[ ]", "value": "skin_angles", @@ -2102,8 +2102,8 @@ }, "speed_roofing": { - "label": "Top Surface Infill Speed", - "description": "The speed at which top surface infill layers are printed.", + "label": "Top Surface Skin Speed", + "description": "The speed at which top surface skin layers are printed.", "unit": "mm/s", "type": "float", "minimum_value": "0.1", @@ -2457,8 +2457,8 @@ }, "acceleration_roofing": { - "label": "Top Surface Infill Acceleration", - "description": "The acceleration with which top surface infill layers are printed.", + "label": "Top Surface Skin Acceleration", + "description": "The acceleration with which top surface skin layers are printed.", "unit": "mm/s²", "type": "float", "minimum_value": "0.1", @@ -2761,8 +2761,8 @@ }, "jerk_roofing": { - "label": "Top Surface Infill Jerk", - "description": "The maximum instantaneous velocity change with which top surface infill layers are printed.", + "label": "Top Surface Skin Jerk", + "description": "The maximum instantaneous velocity change with which top surface skin layers are printed.", "unit": "mm/s", "type": "float", "minimum_value": "0.1",

G=9WpJ==uHUhoiGh6ZCp6V`s_Gl%4h|3Wssx02hPg^+}(mpK4g7X zL9qShB5U`(Bs+7vCn2zR!Zh@jKAvO0w=BhWh4kWBHTY?~I&ed(G6pK1P~u(NOKeuf zR&2$wP(onuglSj-tnPVsv{-9)b#M=kRqfK^RhOHoN{{c}G9}!%UuM(aMl-gv3n8#~ z!Zf_GZaUB6&P`_3Cw1jmH5FF(yk0a-`O(o^ro^0}bXNA;O6Iew10k??!n7cqpLT&2 z>$sW~itEU+>K&|B&=#r`yqf1FQ^KywO|~a7g{|1tf)Lm{VH&FAuRX{5s;AkP0j)Sz z{rnK8zFd>0^jhK}Q{uaDpLPB9C;N~`A_VqMn1-kN;zedu^736H>vOC!wTV*;eM?ge zh23RJtcZWYDqShbSHYZ4OknSXX{a{6JDojl;>`Vrd2p;cH8WN{)ZnDz^P!?liP9_H zFyXW}FAB2(F@e1krXla9-eQ}_*5HXDML1TC*&3s6gl9$Gp)N8d#-x2^PNnN}Uhh7` z1olpthUc8$|70)w1@fZbZZWL#-aAD-0j_AtNN1T6=a%H*g*r9oL8q4!0(&P+Lj?h^ zH_U%;8y>!90mG^(dnT(B;Q64%0C?{X#nawC%g-;5X~XOIRVD=XPMC&ukq7@^k^UjP zYmX8PtBUN6R+le2saW@QkSSqEFU-Y$ZFuE_Z4Y4rdnZf_!lp4+{LR3Q+)&HTAFJGt zM5!+#pc=_6JDC!r2RZO^JDYK7Oi>XN*gIhwRz7)LkT0LviucWM6R|4!{v>sL?UTxk z(uHM8Z2s)T2NyE%wGZYH0(&P+!#fRQi}Rqv_4#$*6(UxpxlU4d!HR{p6>Mcn%t=$e@6Rt&BDlL7KUyO{_d8%C zVFG(6Ov5>!_6r~S$cAq}Qb@w8xAqfNyBcXq{B3KQ5~I&n=F=D7U|(03Aq4hLn1PoabaScLX?}TZ1Ry5h0dv^bo#pbCgVbz`KMzs*QyNghP zh7xs(`0_iW-$DY^`YcMwE(Q!H}RFVOo?G5e&OYK0jY&eAwpp9 zglSj{+tH1;dT%3rY?)ueswOihs{Q-G4Aay3WlC(m>cs1~RF*2;z9V7+dnZf_!sz8L z{PRdRX-2>$5v$gEO;QWP3VGc{TbUB$hZg7kDg;Pf1}q~4_D-0Fl}Y;j_D-0F)e0^Z=d~v`mxi2zw@i_v8=4xW zx+EkixAxk}l(-&g#TQ0&l)~F?@xui6PMC&~iRy(pKiNha+JDy}tm<<(T5Sq-IhW6N zkSUSgTYKgeA{DSJ%`kzz8m3_m%aeS3bkjCcp7qrjRs|iNtcJHsQkpDulqnJOJ&{!z zS=3bCJAz|R_Tf{!y4gQfiT>#$hy93G1tC>wS=<-a1{^nV9c#Dptf}Sp!Gyrx3DfXC z&aFf?clKFR(1*bstMY;K@{34SR-EvWDN(fVdUp1^8w(E@NC@nmFf9lTwodXM75NSEcU`|RSbljo-3^HE!OG5ZF6m8Y)4vwXAx+U97!bcaBx2ka)FfK$@~C!AqvZ<^J1QfyTEO zvkxW&_D+}vC)|BCyR+&(dk-r-VAY^oacY%S@XpUX51A7E2JT^>GHm%OADIx?J7HQ7 zJliL-9yUe!_k0S+s>A+q>S^u0qC)O6B?|67$R;nY#3$ACAO!YKn1ynjYv^T$3GAIPEeKuS?qp|O+VdHC&oZp~xnzp^eDO(Te!R0x ziC23ru<B#S1?MXb7aY?4|ER@wXuU;O1dMVDE%!7%4J5V+YE^(}s|f zB37-knxtNQlBTq6VJlOj<+Hrp`j!u$Io?vj1olpthRWRHXJ(OBg@5R7BVko+--+tX z*=dT!qx>=@Zi2J>cpcs_wX8r0?42+TtKDQ+@H)Q~<@KIblCWwO)C4RCYu=A2oKL32 zqscaW?uP_?v`P zExW=xap3N(&sfTousL0b*Bf2hRP0$BLSXNNX?UM=ULpQA#K}~*Xt0D;n?j80UT}B2 z4_nHV@QN+OGX^&@l>N|#5ZF6m8mf_;D8%!34K(acZ6je-+ipg+Hn_WD7ht6g6c4f} zjQjl2!A9)-zBM7RcfzzFJYQXix3(xCMh|W+5!C>r`U%`!X=^K)5{16n^6uBVipt|( z34y&+TSUW}VFe2D83((G>&yKrVbx}E+vU2YC?7gN3_?ULE5IwdFBVI@3nB#ePMC)F z;a-r}IMd}0Urt-el-T?uKTj-jRGeTHKnU!eFf9mG(+luxtB;C@ z6C??%_Mb4SeZM9v%X(VNlqm4Ynx_Xo6&EzCO$h9rFb(yuL>u1d(o=C*cufhbe*a)p zg_LBaciDV0CAPe_;H7>RmGalALt=etN)m1hvFoe3+ZFZ!Ne zroc&Yq`oVbtjz0YD^sF%_%pUC zwyC7Vq>7lp-U-vtzk2kYxol`GRT_0j#Huo#Rz3VZO0}Dwq}boElPRGFpJRTP`bcF{7a1^ty%VMdp{w&F zw#h9_O1WRdfK{avqt&f_V20^V2bmH}J{@QFcl$|uGMEVy*sEb0-WVBvgLQcqCS5!A z*@RW))=pN-!R*g#I~-+7{1P^RE%{l-RO(VB#|~@aop`kwxVwmVKJx2_neMKLjppvc zrVnPn?Yd{0ReK~Muy?{VJXbs1pDmhx&vYSTB*&_l^YLojkW|I;kdI6Wu}K8`V`MF6 z8#Rm&*gIhwW>Zz_&t~kY#j4#I#TiasE~@a;!S5 zz&VE+bn0X;nGywdPh@wlyk?zywI>AjPMC&X`0gHT$-57%V$}{DtIC{+Q&X3xDXr#s z$duSTdbzjzWZXG^lsvF0uja_2Z65>gvT3%O~60V14vG7+-dEMyzguvbj z)6mN>3}Q9zw&I;HSaGZ}jfS2?KyZp-oV()}$n6Y&w zlBEvq$=^RSF|3+kgsLhFPAZNoon=bI_^x1G1N-x`t@{uHdnZi8%;i;+*qY}e}LYU6q&}{GQW?^>uuO@ho{U|B z6+Ol`ctQy5oiGj6ra!G`VQX6Q$eHg&th#bL+29FI2zC3+}FC^?WiVVmhR;-l0#~mX%EjfxQ!^1z~%I<7~#@XKZVFGYPA% zf%AF-?rzp-Ync)UI-X(`HXdOabAt(iy%VMd;bCYp^P8%&^yzISteQ5$s9pwlSL&ga zOo`7wPO}RG7qIs;I}-wXCrk@M-%4q0vHL<6+NO(yRb@LE)gs{TqzI@EgW?Io#gb>) z&RXr6*X$mIz}^Ydf}nId#j5<;fz>M?CSg_g21fNPxV!Eyuv#;U2P>>DKg&kg3Cw0* zZ$e=2glVYpo97I3-~x+#)?31=8g<}(HE?(D-dM_%SUDSFR4HQ`zMwB5uy?|=ApGWh zmMw$6kNu9m5>`dk$aHtJ?_0{0SZH~cT^to;Xfclx*gIhwW+Cl3%NFizY)Bi>SHdc} zu2HQ9?#}X~rA&$PZ%#AMiv`5$v*B1F4~V@Jrr}vp)LC|PnyvV<3J}O)^=xERUxK@9 zP}xeR#Dxl{SX9$c@%73cguvbj(}Ga?-WfJ?Mh~&ti%(E%W5sc?h`IE#m-wf8guvbj(=caZQYyRi+FshkYe`sj zsmVmus~@cF@QaO1iO_)AclCR=S2<)9O4YP5F9%FR})RZpIEGc1CGSubVVxO#R zoM|gl;+@k5CfT==?tFSHVgh?7Obfzv*#vKfwUj=dejsAiv(1y#p(#nq=eWW$CBDyE z#@thTN_l3kA_VqMn1(qlyZ5k5#ls|vqO(M-YB4QJJu@Ro>6T$9Q{uygIqZFh2(5_G*|G zgl$vTvdU|RNWblfHDT4D*vaa-&PmGElTb4g#S;XJK82ZD%-uAw={SxZ*3#s7^^0Gs za{0NBY!4MZv}bn>^JwmFs%ppPq`o!npEZUM*gIhw?jK_dF*WY3Y43qC9IF=p5wE@+ zoT}W}<0DhT)YYC{4pEr%yhuV|?}TZnl+FsWa}yMH;%p?xs<$wsvDaE~kez*GN)#CB zz)m%s!WL8;MhNVkFb!2`Kie{S$rN_pIE-V}{OEYq8`dkbx(DtK#e|pPcfvGORhePSCKTVyEDjIkST&?mylPc2O_|=nTc*Sb)seNkeu|Z@+nW&BJ7F3! zgM}?K6ga~k$M@z~)yp$p-DF5p8b*7`l<>-1k?kHW@SzJk5CVHAOoO}g64-~EdAQe> z4jii*Zi!QmE=^O8z_U9_jLGlChQ2G$S9O&MfxQ!^p%-raX<8Utk>8pUz_DsbfjD(P zRE?Nl(p{!Rt+_SWfgq6wS92u<_D-0Fb$&KvnC_*^Jm&Q;9IGN4#H!oi{iugUTxCkA z;|y$IgLeFLwLFBt-U-t%`q3s23vbzpKOFU)Vb#>GF>1e|CzUlbTx3f8T+oPh8qtq0 z{?42+TV@u~tv0y96 zRbFrWu}bO`t-glUBLb5hWJ9y%VOPC)2kY^Z^j&IfnbeXgxci8pp**+Hus z{N7;?LSXNNX{ZQPrX_PZTb*B8TndvddTBd||f$^+>9~ARE52LBb17h!lX+g->FM{>E%vt)Fo)T6) zYi?8r!_3TC->qay1P`CUsz~!#pFaHwfxQ!^VVrvI2qvDL$0|JTFJV>bDn>O9+}+7o zE141-Dj8Y%q&BRVeFPz}cfvG`>8FfhvB!d0%ZLaGtL&YOs%x)QMXU|0%cFSUYn_bj zRMIySyE>c@*gIib5Ke9w%ff7an8p_wAz>9SY*Zt`-Sy6AB~#+c;R#F%b2QD^HIfk6 zJ7F5C+$lpBoq)H&X(8Crm?C`Lqe_ zd96kUt2rYjtU6l+Mkc`B8Es*vEQ$xUMY@b-W83E!{SOZ(1olpt7KCP=MmD9njreT% za0#n^aW<;+!QEAp;F&Or2hRsjjAFaTbP?aYA3_N1oiGg}ch*Mspkz1EY1j}6tAy%C zbrHX~^O>AXUMR0fH3RufH z9^BO$M6j(Xs%U*Xj1bs65n8wwIga_aJ|^}|?jd2-{z#*G7-nX&)z&g4s#*?YT~0j} z*Ub(g1olpthLIw#F>LMP=VDdQjuKWK*-h>d? zJ7F5;Gt@A$>)q^OEIv@es$H-);AnVumtV4xDG`3SC7a%_hLrKan-JJLVH)NEEE~=C zeXc3>IpZ#2RnT!5xdV5%bDOP9iNsF;a-L^d@Vgh?7Ov7kYw|?+8RUgT6?=BImg8N6QEoLSu zHsy=Se3uy1a3aDY3|@ zG=r8XJt}g}9~0QCVH%w9m$ob=aI~~5!21wZ9q2b%9ojWXx$xLgrUb9N=TN1{@lvfH z*Gy5(CaVIx0ocT12$u0d2m~d-4SuF~*tw3q0 z(YW}isbCoNc z6C~q{L<3emZ3MkOAPhzRPW<_1zv*!Iu~OR!MH$}1-v>@n3j(fD&4v(o+c7N&`?oY_?SBrJHajT{tA55$QGdeo+T|(EG9~2TqHLW1 zXz5%^c|zc`iD|eS6kX0noe7sVAB|vG6|ruLnx|Ki(s8%5Oo;}+MX~*hhDcFcf(e1g z128QJ>D$h;L$+O{fEF_tRxLU_MRf~JQZ}!0mMQV|$wAicNtkp&i6R7kqKs)6nXu2p z`L$+J`_gL|R@q*KwHje$B7K&#Oo_@f-moyajnr!DB0}If$(V+k9G6S+p5y9BHbZxl znah1&O;PRJ!#SVqEK_1=lpUXBQD5rgwuKP*tyWCK+XD@~`5VzidROEqdG|FWZ;WaI z@4oIH<1ABR-hPz#bea2O_P*^!<}VH z?5yL*7YK!=9-e80z?F3|EeNI3oAZ#4SHvyluaNq?Cw_@h0~;hM&4xP5l-NA7Dfg;; zPpn$(5+U%~ESQFT72Sd7v0o~_Y;uFF;G%lRs2BW`l)=NCWlEH-(Vj0@kSOMFaGel% zbx%wS!am-e3&#v%e#={A4bZMNW7LW@layaZIm?u&+@w42J|j@ff9NJ5%2b=8c65iz z!`_ZEreRgY*j~I%$~Z%<4mTK9jjkJ`274zdttUGFjo31(7hgJdvY|jnN|dTGMHR}! z8`7SRGN$1PR+$~9NBxILB?l$4sERSFQ+$&0#sli@^o>#b!u*nq-7fNs<}vDP7>z8H z>H_)d(&A;NbzLH)_C;0_0%sgd!^)(k8?sGP`bufO2N+gK(J^ZAsWA6rHH`-&UVHPi z$4>`J#rJO_1kN~^hP#390yZtOi=uH}pj#EqY479OZ<- z83)sX5SO09=C^4n8CP6mSoLIIj9Phek`ff_B2$8Q+Qk|#Zzp|AI!6ecaWE|iMQ?v$ zgB3~YVf%<-)xI+^>Lz27Qpe~bQ)06BBR26#BT1cmhY&d9U>fF&*0<-KqdcX1&0aIC z+W#;{oes6UPmghtDdBw7mWwXcr5Vqk5dvo%Ov4*IJ=}Po1P5tiwT}#|R)2|6pA1h@ zoFE1zBG0?<%G1h7e(T;50%sgd3&PK#b$MjSSMf&jXNFakY-81vgOZf8<6UG*yzg3* zk6(~ivY!2k5IEyt8rEJ;4dUHqpAhfe{lu`UK064o3;!cfaxH(F??$Pbq;j4yIwHzaL%r znQ$L*>%C_TtE&3Os~&-N`+`61gupop(}M6~uphH7 z*j7sKX34S2p?9omJeH(PsOU=K!PWjgFLON*B8_eJlVJj998AL-poM3#8k?I)wPzLJ zShds`tByL7q?~kel__zg;$Ze8sFmco-kK0N<6s)ro8U*-8Nndcds&!cRpmvo>TReT z`L%?rOo>-(erKoNDpJc<1qp#O4yNJVrF*a0yj@<>@?~}$s|Ie5RSz6UQp!LKO1KHP z*_zwcrQNng34t>Xrs2tG+rr$vQ)!6}E5@}vDG^tFBs$^6-u%r z1kN~^hTPuk7ye5nYpMHKJC0S~uEwhQwkIjo%Dc*x=zgsXudt|~v}_C|aK^#3Ae@?1 zgSQC1BS!Bo%&|&+7OO6THP)>>U1dsCSXzZI@AgcLaW6s$oN+KM2oDA~;MaTX5GS}4 z;8<1rTdaC3F-e(P*HxxO+OYtBb>kmmm8+D%83)r)q3LQXez%=boP0Si$12bKaq5%h zNy_}Dt}-RYH*CrKHHi^lFR~;A&N!Hcnwg6`@g<2);?ygj7*<6Vi&IZ6Oj4e9bCoGk z^v@6;_ojmQRro>(oN+J>{gMq~{CPkNL-!L87*>6Bj8m7*PEwRnt}-QRj0@w}twRiB z8a^Zh&QX{agqVvae28%Bbq@@{Lcisvpcr zo-4XTzS^5O-V|aVC^e{Do)9=kVOkJ8zE)#OvcGi1(v4%)SC2T=6Y3Q8_i`uk1mVmC zfyv&o6t%koA#ldQG*r5+lfe3Xt13Njq&Ly(1ss`c5=7b0q}MIGBc8y%D1 zix>JWO^j?-ju1HGU>d5JpRCWj1uYU=eRkkjm28SrSH6XN?ErU~5)9Ug5BX!I_&_d6 z2%K>+4Qm`e{*~KDbr!{%1vyp?PK#6Ly?{5QC%em(nA@c}Z<)|X?9rhRA#ldQH1yjy zb>x@tTZyOA1&&p_F2||;AHz7@DtDO@qwjU#Yrhv19d=j{0%sgd!}|u$d+@t8s~Zj# ze9W+F$n7|_#{DE^8+Vr}VSl&>?{dh`@O3#QaE`*XAlz?0)AW07H|bMGeLi7eoEq9H zSs7ixLw>t6PECipYSzDd$Tt?nsgdv&{-T{8kgu#x4K&@{=Ptc@FA)OgC``k11J#37 z3o0j7IjeB2Isxb7QdqL0Zlv*`p3I^Q)7sq?q=XtWA#ldQG_0s&KZRMWc95PfYQV9o z_=7lgC{+Kxu-QYV#H@n7Si$C{rPg^Ufin)K1);Oc9yViC0cle^g=5vyZ*l4$U6Yj> zaC|6nZhRseXec6Gokt0raWDcy(td*pEXVG9{eHU1UW^ zi_;`o z@%QqSDRI-eDNjt5#5!_uLg0*pX?T~cKnMPz|1HDgJC+=)j*N^~Z#GO;rZ@AHDY33g zdp_XQBg5T&R)oMA2h%XOwtWwNp=@!(uWOz%tQtNsUfmb~eTG4vG9|p-dhqVWoD5>C zXN15x3e(^@??;=w!>yzW*E;a(U*go~+mm4}OD}n)Z@lUcwI;95^^!A6#H(|Xl9de$ zydYnhn)Ea!#8^vH+fV}MC``kKdLpWRNRKc!Amg1leJ3Sw#=$i7 z`d)2g_ARc9Q{D!1ta62Oz6#dVd%n&~rUXB*nw>v*SDbvmEg^8m!8BBXvb@Ox&zumq z4QR=+s?Rid+leJB^Y?hkl*kxyj5}XvQ=fGIjP&E}e1gQf8I?Fz30I+B#;#N5^Go0<)<)$hM2D_uKz%amB?+m7G2-(&c6Ha{V7#=$gHxw#X{>+X5tKjx3; z46Ek-j91TZOjeFg@|G!a_K#5hpwS!uCjl=AfpZk5;r;Wb-A%QeFNv4h_2D=#P3;DA zAff*5);8X93CJtwVNSq@U^s3j^TCqM}eFE!@M!{MTlU zG@SFr7QCXvRPjNlRvfEt!ds?iUnMKQ%=DHikyJT@ogX+|bgbE$5IEyt8lFcTao}wW zM2HoaHR4#c^3QlR;RU?6y}?_i#Nb}VxoP%ru}G&tLg0*pX?Vwdw>v+Qzp?n+?YbPR z?tG3{D?LkAIv(?uDbaYL8{gctnOJvyJwo7&gK3z#{HZRl9#U3p9q!4oD#9i~-SjwF z*>~Stro<@cx_oa97x9>v7a?%Q!8D8k3~S8WCOk0I3UT6CRlQV#>i8%0+pT?MN_cz- z;&-|~Hq?GX37l~-4HZfAw&OpW#T%C1wBcCwqhf+O?ml=bPal~QrPAB-2^SI!gG(16 z1kN~^7KG@9p}hO({r+1%ye|y7ALf{;QX?R|{ zxPxirkZs~+=fOOrd%W7dbc*tDpSK(s8?V-YxlzW~-tvb*aQ?khlu7Ve5Z=}eG}WKG zT^#p$5Fv2J!8FW0FHn*xb=HYjJO^>C>bf#sEe>_hzrCmN1i>)amhG*uLEPDh5;)^v z8s?YO8^Pv}SR$^l?9Z{vdVjo{3M*$l|KTlDqRfYI)~Mq$v1unt;EaQ5c#gAbBkLv2 z5P#p&i({3=88~k4DT<%1k4y>sz_sk5)huyGmEMHF83)tw#>j}vtnPt{Vy${zIaWEt zoA7F-6eXpMk4%Y>b>~^@h$!*+T}t4LgK3xpd060+9`qFNZVu*HRsL(dTF^B`8Bonf zrbOE@KUtR-eZ(hS+7be1985!>;Zt#bvtuJMwR#hdRksTzsP!tODDRs3$do9)-=4=; zY%CsoLkXO5Ff9nx-nnsyBNfFzkNR`0s#HEfZQ+ull<(^!Qz9sj8}D4kO{^SgAOy}h zm==U%H6Z(Zun;%w_vTo2wn~E9svN8=7w02WV%+LF{NkLv;@0{;guodG)6j>z6~u)m z2Mw{G%W$mPAtk5{oKut*TYO|n3?3WAzZ^3eruTIw1kN~^hKkmQ+VU6WyBkh!D8R95 zRkH-u+X<>{Uht7Aab`eUE~oS~{9f9Y5IEyt8s5kq6Uu#G&-YIo^O9jze7gkI&M`$9 z@!dzJ#G>Aze9V_hdw83-3I8m{9bqCBz?Ksd!ro@Zl z1zA1EC~?CVO5lw13DJV^tHm%jVs(UgyUY-dRZ*AY)qSwuMDs|9L5OP^;cQ3c;bPCB zl)xDW(*n%f*}w`+>MB|o!Z}tAd=am%gcS={O!1K^@yDNu%=Kb-(Rv3ZaK^zjgYl=!sw2P;~srnm&WGbV7x!8D9B^eE0#I+qqVSv2QZRmCeoJ>DTj zX_o3EQ{q^#J+Jv&8PVZ)O5luxX}A&%Zv4bRL0nc*;#g%A6V%}LDN5hRJ~Aaj=U3uY zQY^#^>nVXV4yFa+&Hg&vE`O?_=0IPLRW(~AsF&M9n}A9xlnDBz4nKVSq+wkKC2+>U zG*ng{9KN2{Z*wXeiFSM+uy9Fb!+b`Ps7`pX-YAY({ac z+Ilfwy)`#Qi9SZ-K~LszLH1yZpLnGjC2+>UG)uj_5aK^zjygzutp8Hwf zG?b~?f@9VGfCTmN%oN3V=@7C_#ZJd4WCa{;aGJlEJ1xYJw>@6 z<||Vo`e|)G@c1l4fr?cLfin)Kp+b{O5Kk-C(r~79IgV8qhbE}cr==)X@xC%8x?B(B z^*XjT*bb%y&N!HcHL5(@a^HI2{JpITa;(ZQCaCwOrYM(p_{x-sv~9~DEdSx3QG*gV z<6s)*`^cf(f3my(+~KbnR#l&xpk9Ey^7Fc{Oo=lR^sj6x`%f}b0_P}93xeCVMy5x- zo*P`gkK;Hm9Z7*P{nQktHMEb7JL1*H@VV+MEnoGiUDLGV+Y3YgyyGc>G90D_p~wb1 zmVf6NVV%*g@VlQsLB2xqprYKKLM+bxuA$LqO5luxX_&XvY%m-9=&Yf^ z=#d<&N_>e|Z6QYSyuLCeE@t#+g<(X0@dirZjDu+yFKM@qG3Btq^mH)Cs;5N~)Ga9~ z%G6@MG9`ZAOk^jf9x;q_8$t-2aWE|iw<=sUG^}~={FAkLv&fL%r!&W@YxNS;ba1Zqp1ZA$HWb|0l4I4pUlY_G5Mx#cUzrlqKNRD9?qoy#ca*>x2h%VwV|XQA zrfw(0SPPkB)#GlE6JaenQ>3p37l~-4Xb%Psm-1DdmAEnRgP6V zh9szcA%@=)Uzrli_toaH$9xQ>-ckZ*983#>_$ZLixbnsS`5)ytRvm#{^6*58a`3RP zOo{p|kbgMw&A;ypO5luxX+g027R={6FYx~qQIKQR_h|`gcZl)$v9C;t3$KD<)sqGO z&!Q-SGY+O>4F-#=$gH(%G?=Wz-T35hWuyR^b)WD3Ql?EsMD$81ng20%sgd3qt(#^UV6wBmY1B z`*N(pYiv`(WOts;uJOcwUwca6jDu--?=JEOD?9a+|Fz&Q9IML1c!^d|WNi!Z1|FH8 zkJi>|i@bOJ!K(HLC2+>UG*rfOw&#Ovcla9ywc=QHy>;gAb`JNIDe>iVF@E{R z4*#fFO5luxX+fAER^lgL%=T}(LgrZI(=#*1X6TntVzqN6UhUu<|EdQmfin)Kp$@%T zo7dgm+drXtHI7xEhG)iTyv0|hgxA{IytkpRfAdz9z!?YA&;!^K$ZO1X^N;W;&#|iT z5>@jW#G;$Q ze9g5qzjHe%fin)K1>rVipHb^={MhMN46EiY%Zzc_wTes$&wB7g(caq6C6N+1M`0SO zA?p8(9R4#F897ZA>Yr9%#*}O!tkXX)NGTIw{yrn4He9=z|8zpgD}?E)jEtm!-wt)r zKhM0rEuey9XZ`bp$o&ETPHZULT~~d1xSr6Iusgg^R|!MC1I+R6pI#Y|xBepi`;AhS zzr}dJrI-GfjEr4`NUhOR|9(%aKmJCTe^=WN^Jgsv-a@ifMzcyIPBjnHfA?~sBZQ^| zR^cr%|B@C@Cya0^wDTeKsnSXR-C`5}`duyFzaL#p49uTNZ{C}ly;T}bV_=ne3oE@n z{Z9h0%&o#i@aoJMkykHd9|eu3F|f+K=Yd-<{gcR!fr&rAWL`_qdyz$)|k z|Cw?9pM=r8ADFmi)lEOrQ=dHuz%-44RoA!l(FxbRcmGLb$G}9M{h>M$74|#;(=-NF zy{s6n6HOBT{3nqe0}~s5WM1L5@4gMdG>w5(d4z#_j8chD|4C%Wz(l3PeRX1Qjn4s? zrZKSUuKN(37&`yOKZ)!ZnCSIzfKC*v_dNj9GzM0^o-#})`iH&xCy^Zk6Z=|5=tTIX zp8=SrF|aC+5UCRx8L$3HWXHfnulpl(V*C3H*z><=8Uw4GMvckdkN+QWdR!(^W@bhJ zrb!GVR(W0-ugB2N$G;K+CM*P~#twIeUYmXdV4B9jDhpwvPH5NFzY+o_5(Z4t3GHgf zG>IYPH7?LqKQc-N%sY~qeNuW|tUsfENB#TS=PYP$H)3MNv`jjvf<2*W46N#EotYU- z@`n029wpYa%DhL76Rfi{=evvv^$UMCZ>_ZL9EoSC3)L z%2!4UW2Q>mbF9KN-6~9&ReNrfAvB30V3m0b=g)EZCjnUI-N1aTwBNnEtDU}29lll1 z{yboH^S|vmCh)nzG~ExZ+CRO$9^>xx(%CVzc>hk|D+AM%FmIK14$OCC?F{1cPY5F> zZ1-lKXYFiani5!ruZ({s1asf#$J9LJck%T`V-O;%hqTI=QU70K7|s1CO*M%v(~qvU z=l@Cwn3#4dvlkZM?Hi%VRtZ?uFKn?MBl+s*e-cLXbv3lwQeCC}Zl1%LpZ~svG=}+@ zjLoQ=eXO)TmHCKh{l|YN{yHD7gr)>mnXim$Z2td~FrR;|MPZu6FlJw)g?k5>uQA-Z zvRjnVe5^2GzS?J;oIq$2L%=G$RXCnbWXHgSIS=~oNeI9+C9n$b?Y|S|d(q4#E3@wz zQ~R#|_v~ZLw=r73O0=Fn&WXi0M(N*QYrHk{oM-O`CYJStN-=O()BFIY>3(2UIav8! zBeb6WKM26|oCvX?`T?l4-ZoZYn#RC{S*7)(F--}q!v5?ZMD|wY5tis%^)=%YX?M6i z(ioUnyd;zU->nv_a0|wHMUP?LD&bQ;^IgrA>@B|g(5=Em_pO=vN^A4~*mI+~ePGo) zDU;B$!9R%Xtuh~z5_77PwrxHlKQjJ)$H9a-+wE>qjnMjjWXB*X5}doM#hQ zWzGg#{|d*`wDbH37AEvEGt*#uVMHuw)Bd#f;E&X0f3 zD|(D<0;_Pw!SN_z_Q+aW!z$c@31P&9+5KwwT})E~tMK0bD}7vutoR>C7prh@ z0LO!RWY!ZT?O^#2-)Z=V#}Upbx{uP_5`5O&QZ^yvNWh(1BXsYRMZ^2Gfg|-8XD3CA zW>=)C^eYim*}m=XgpeZvF*E|xf-pR9A3et9&~y=B;rf-YZ@W#-gpeZvF@9v&1YjC! zf9`6f$4I?gOu{WnZ;uc|Yv(xtn-0scrz?4U5}9m+M>Bfrv0w&aUq6wmE?ke z7#e|TsH=9d7}xfL!?laOv+hhGhISq2f`AwrfoZ)B>M^tyWp=!pN_WK&Lu<9UARvZD zU>cs+?rx>W*bZ&c?6x(P?uxbjfb5eCLfa1@Fb&n-^7PST#P&=V|8m`CJeXLnAP)-*NO9+8xL2sx_59mZcx7lDQ%D zV^xySF#pPWf*#|{u$?A6MrPg;ZPWnA`ws$QXauHVW@g|>Jx1NAXlC9IO=Uhl+E_*| z2#BE(m==VaS?9cK&va%!ADZf~^X!@%LO)ingcgMSS=VmLrDFWA>&i9zdes~xj`tq~ z#Lx)y)vkSp2A;2`eysk?Q}K|lar6B{Q=Sn^ajG#&~)}!zuh(44`}%j$NLWg zVrYcfe`ufe+^!!hEw`KfhxQk<6Vmd0E(nOB5t!ERIC>229%c4Xno9R=S@*$Q5c;u# z=U>F#rDXZRs)MwC?_XoD`dE+gtUg++e-EECXFy~TLXHH)(8hNuJqY^ia9J6nVxmR! z7?P&aM~&cjwK3!z2_Z*9J61qo8fxif`N8kq(na%Vl%~?hne=Vnl`|paNI(p2L=e+3 z2NL?A+J5YVwrC!|(p3656U5NQ7IP$o90`b_5ts&#W0mO#4_Vff%;Q&@N*}+17}{80 zj)agS0WmZJ(}J)&%MX@>{V|V=WsV`jb7zR5jYj532ssiEBXj)nFB;x40bi~it5tAb z@R+4OvI#LVpH1XI2ssiELnAOP2;HJH{ooC_zVL{tKKcPMvY&-y#mgpy90`b_5txRz zm&a%N!4=R>@TiJD+5*3;jmhLl2ssiELnAOP2&*UT)cxR6h=E6O^f92U{m2E8wI7&< z_s^p<`wW-iSmCiHeJm^M_~e4fIvKL z8Gq*c>)+%32a&ZOm==WDkf*eK^$CuZ`F^hbuDNHS9iLnfS?2@OFuy&s?;}ixb8haJ zXuqrXgR;(ZE(nOBT^X3p?!#&KL2m9}X)1HSO}k!mK|lUmVY!mtqPVWaL-*!^nSJZFWR=7KWi~C4J%YQjpNrN9QBbkvq~eZUrkj|(e<_nl^_##?hb#v- z4S!KbHO3*&O4;Us* z+OxxuIDHmtm*J@s+8ohL;;iB}*c0x9nY8vjjAe8juJ?U*In5UF)BDW*IQ!Q-M$qQ9 zcZ~jnfOf8J6{ZED%Z!$KjNgV8=XmCc9xv;6_3zr_Ygz-KARA7B!JckOhd)Rthol~jM1Y0mn;=;lo_MN zL+6|cAx8pejli@Z)Xy4Q`lCm>sQ)EPH88A!z8@JGPB{}ojs(yefoZ6dnl-j`_F^$f z|4Wvtc~wP^(XnyqoCzUE0%(oEv>*)38e19#zE=NBmTL3f06oUu)1`7Igd7Q=H3HLu za0j*@nv-!e?2rDJEL9$%z8+)tl9D+SLXHH`8i8p+=-)kaY$*lKi~g4^)%Mb&9z!`$ zB4*jxF7WbFTj-OJyn4&|_#Dehy$$Lyv=*iRB}?_k=_+~*t<~m&09qq3t>+Rw zhL#!hzhtQvE%DW3XxS$h1kf6RX{b2>-bO!GVdD_0UtevmPK)20m==VC z=J6|dj-&r2OJ)Aup$-*uLjbK2n1(xN*0D+g|6$$_O=Uhl+e%l;4FNGU0@LK2GxPb- zRDYdkx7-jABO}9&(B#_Xe_dB@+1G30-paWl{*SWr0FR=0!}uT_EPxb2dKIPjc3F}| zKspMF6s1TJrAw1`C`GE2#DpfG6s1Wgv>dDkk`O@@MFFw*KPVzaK=^;(%+BVWyNl*{ z9)0%7y}x~@x1F6O4<>YJ=W8K0y6d}5XZpK(|+{((T}ZmenI6$b$)_g;+CPJvVrd%9n0;S*6?aE+-=*$b$)_ zg(&N;EiI*bqWce4>3)g6F&PO#9!wxD#4&emi9K{b$SU0<2mAd8;l=}Ls^{+7(j`hO z-JkP)^~i$LEds*L52U@Z507L5dX&NUy~`b6asEd@kOvb;dt*2rk3X+i^pD{Q5tbkiCXlA@ZM%C7#>0G&Rl5C{dG1_z zLWCvAg9)UC=tj>ssVVXEb7%RBtJ3XYiL_6{6Cx}@G!sbEI<>pk;2WCb=ysP?x;=k# z^vUpq2uqL$6G+oD;fZQK_%_T3S*3fjTX#-`Cq!6+JeWY5>c=ECA6yOdL00J=IoR(% z2sa)`3sH228Z)ed`5@m{k1ROdA|TxSKw5|!^n8>1k1~|!dR)Ty)gvS>B@qzh!35Gm z^mXThonb!6Dm~KUavT9c9!wxD>!6%RagEaBL{{k$E7!*e2=ZV8X=6<7%?DYf$L-uo zL_m-S6G+p#s5>7V2lGKz=@|sKj}Z{$!35GmjBw{TFT;G0ReC1G?R*3Tc`$)=##}8H z=7X%#Gdk{rTx`2%?!l+9G?AQFN+m_VAItGV;RQZOH6 zm9BS{lbc0CkOvb;ho29!O1B@o7e+@ykOvb;3-PYI*WfDUi~Pk^>2~ms5|2hg5X}VA z^qmHGJ{W-cAggqH-r>PkV5rZ(n-tkNTI zZdW28$b$)_>DjiL8;G}IKFBIPAK+Fr0)jl4K$_nFaOZ<Y2Bd2ag}Z5+W=?G!sbEIjJ-T<#^Pj_dw(?uBvez<-y~i zu!IOp5X}VALR4_yMZWiRAxr+^s@5i~lxfA|xv+!?OAyTj(&l_n{^F{-oTc}{DGzvD z8kUgr!4QIICXl9g8t7eWPOE1qKJph=m0c(g9$$wgL|B4oCXhDggYp+w)%_kizl7q! z^MtU3oDYT&L^FZ3IUkh2xT^j6=-p@X;Q3BiLe2+62%?!lTF$(9hlQW#YVsFXCEt}I z51zM$B}7<)XeN+0XLtJTELJ^sWr-J$2naWXNXxX6b2Xj`%U@j8hCk`#H#a{bAc*Gt zKw9Rx^xzr2{KZve6Uu{2NdyGZOdu`GZh-PbmPGlBtJ+$TPB5c*aA}W#AesrJh1if? z?R#xT=K{!ITvd;OZ%7ZWwGj|RGl4XHE5+TvJB6MP%3oa7u@B><2e&>E5JWS9v^gJ? zzqqQmdMXcYMI#`HW&&yIqulpvpQ61V@)uXtt(fxQ-XH>kXeN-BJ&w$C?s4QVt}44w z9^5ZQKoHFY(uN1^J*WG+Dt%w>cOxK(W&&v;`nhQ}&_69n$AeWmeR%v30YM&2AZ^YE zb$+l)=QEFkA|S|v38am(8_?y7Rl23YYb*9Zvm zU;=6Sh8w;A$Zg3&dJja`b5`m0Lyp_sc7^}`9|U zqa{}9aT}M{2nh0E0%>zTsK<${(&JCAj}Z{$!35IYn3_k(0X=$Ul^#cPyAlCG9!wxD z#5^@O5EY*JJV}q+S*7O#+&)G?kOvb;%e6k4AH3G5=O3)n^BQjFBOu6w38amg*Fimx zVinHMA|S|v`$43I7&)S&jK{gVidtJQ&vshfPO-Ok&K@&)z#Qk|>-4SP*K@@1-^HqA z`FA0P6Oq=xRsAoCh^ev6xpm~I{cYV^F)w^bqi|9c-&!wbK+~m8fe}aT`my}QTPEH< z)V}`tAmY2fmpSoOQtbN%)-h=MD#`GUR*^RY4G!lhYN4uZpXJU615)hQr_~K2Dw0R) z?mW9%W-n@u$vM}_^-zj^wq-6O>=-8@#uM?|=y~-|P^gf2_Bid?PC05%8=1$T={r9} z>`a}ys|0zV>bHaQoT{Ua+PU)P4WU_EnXGcmG<%3RXS*L5j=|%o{qxg5vS++ix`- zOCII_igzkqIARxURmBKZkxg$notz`~iTxEQ2YV3FVbJmhHz=);C{cNd^JSHzcB{CD z4Vu2~M8wIH*>|rZ0##Tt%uv-JV#hxvcQ>R^C7+n@)O+}-J@EEDMv7ue(^*KAR^w*& z+mjqbB;0=8>Gb;%`&+x9LDT4!JnZCd4S%Ijp{i_)h0eA2kJt@T3I`Ey67f~(FB>i= z;)NxPoVM>Cu`7*xz)&GA#8nEFRqKa6(@oZGZ>L5-RCOR-AGhD^Io-WJCa*ohA519vcnIwg86MPrcpj@#GCb(- z?B@{~9xfq0hzO=R2K>*@aq)k;kKTSKRi*PiqhH?on!Fycp-Z&?ZT0ux>-HxP^-mIF z{X5S|)%AAcqn}zs-!~wdRe#lZQC@%7ddR;J%U1T2s@Fb$-k?nnRBaipJUE2tXA-yh zBwz|joAqx-4?Z|eUeEh$dGyS3>hBAaR|JJ>&iyJLvs<_F!ai_RJI|xXYhC_@*qD>@ zpZrR7w+z}06{>s%>5B+NR6gJ0Ux;#zRr zXww5#SdKFbhd4Dpz~!WRYm_jH;B(${&S7e<;`o`Jr5+V%~K_@V!mn7NShw0()rId zHH7dykhn8mmBe}5=0qcHdZ0?@T4LgaP{Q*-Vrnr}605zsC>m+g164Zz*Pir;5}pSV zd%jXVPVxA~(MX#fn|3PIb05YUDx@Xhc_6VNUeQj;Hw@Y&P!%^z5f4s?4Q)e04#Ne~`c$g|rNn=YguybH;o3%^HC<3Te~h zX7^EEy~7ZO#KW&+j>NXn^o1kpow=SPZF-=}8KuT0GiyH-N_ZYf-i=Z;vf^v`L^!*I+JJStEWduVzB^a=spowCRB=U4yyD$r_PwxM~@ytePE-wCRB= zU4yyj%o-u*wUi$`&qUhvK$WiZJOaoXfwNSkO%GJzs6TV!&Xn*Yp+m^CJETnyIs2vi@;U<&It_W=mN_Bk(L{T* zZMrsACS-n~3PXZ^riUEk(7kxnCtCx$=5dK^edwCUL75YB^g=2g`yg!+sFJM#5j-x* zoRISmQhD?MXA^X7tSxcO{Yc0e5~;j7l}nqULY17WlZs1;oE3#5{7A_88L4=U z3~AE?RrqZF+(AZ>b}O3u%S;89=J2s!U3 zg4Y?4Ha$=!=VwH4DajfkR|<&Wbq1tO4^+w4nFucJStI1^g$Q0}Kw5hEsSwIKC`a3* z;;}lGcB}47S2qq0WGaXWc<>!NfW z+QOj<+eh>>LgklZXS$cSszTSCA9B1)*WN7Euk!;5IX57cw~FJ^(!(QAh53y6Z-h$7 z(FEPgn_<&6kKyE4g06Y=VGw>Kl(8-yPTxwb%rw=xmd z168_C@HkPY0>{bpKtisB(0#oX7P@BIAOxy(-R5y3`Wb{D3Av&}_w`na=-OBjmUR$S zx{cyK1N}@7B;?8z-&e1A(RFB#gDUKO(9iG?a@Iii;g2&Q`m7Op9L=pW(xwNh)RSuUbUJH< z9$9dEjZI~!^e$}@sKRy-{W2%y z3Ig3XPOnVRHMiO(fhugz(NBo=>g^hlG-3O}4WlPhT}zjYmlZ&c-?w@lS9N)#ZbV(pBL?dQ(b16*={6Hc3(=Y0@aFPZ zigp#NUzF;NGqe^?@%Xa(*ocU9Ngyr1UMD^1>vaM3i&CB2M5jWNN7RUM(UB18l0ceH z2z5^c;;#>>UzAGsqLt2%i;jfg5;IP%x64vFj%qD=@SCiD_E7g#s)LWCz&ON6v+6Qu{YiRu@n zO8REF^x#%BEFr=ZszpUwhEFr=Zs%JpjJAIG8Mte~G zqEuT(D-T{B3`_9WXu}Yk3O(uhUObWPyM1)`o2T5@s6#m6X`Y+NDFb7`*sa| z4Jt~&mAHnI2AfTDd|A%)jId9Bu~;?ni=J) zgI8YHoo^Enk!~}gOFLf+QI6j5=KkXYI(%@z?6={6Hcdu<}OaF%YbSf$&+A@gG*BB)#ufwb4Qb4zXMc9&JUJ-@qc zbVNkD%>>d$k7McngH;**QuBxiE?3PB+URSojDE1W*S`k){THF)p?hbhjWL6z`*Z$9 zj}tiEA|X_MAZ?6&EIlsa`|1%A=YJ%GDpyDgu}PhvEI#5Bv*fr+G4k$U`2825+AE}uxj|IM zxV?inAK+Fr5<<18dj7#Qjj7!^&UQLcPR~F17d@}xc0Lk9^&d!Q%)B~H*zVKwD84Vw z&mtjI4~I0L1g*Y&@+*xK<=Q0eR_AAsat)F88t|IF`g@A}JADU|h@+Fb?EEc=$R^a= zHFdt)&>U&1gRTb?Au1aCut(MiNz=}L&%>ovJaQ~8QJ>?1DqL?h*F`xVToS!dx%XAX zaT!~rg*f%$NLhAo#=I4UyOl$CF(t<)x=xmB8R|}&s8MsE^yu{S*(fA%mj%*v zS}72yQrF3HO~xehKHN=u^skiHLLzimhoXf*0#)i-y%B+aLOk*72AR5>I*oA4l`22D z&rX#qRo+YjRq8rfKHD~lA|3yd9zXxxJAef4vqPG`)d&Qt)O9lK>r;Mo+R$eY%Cst1 zqHO>P+-HZhNuWwyC&Ruz1s%dqd78A%X83AZ-$;QrF3HkA_Lq8a-OZF|+*4!{8)ytl zji~?Q>C@acQMF`9V_QjQStvq;CzJ=$+(z?1wN71o;Y+k9G1;zPxTCuRSJl)y+11}4 zY1f&0XZ24J^84pR@OOCSD3h)$(THP@k5-N7x^l&~|3a+ZOlvZ(3Te{=LxpXW+4^9p z8=oxueHEx{rc*_;tFcd~u!5cgYz0=zN;p z`(|^)L&&d7yZ4n}fu?Krli$ao>+K~T49au)ZF~BKzlDu?fO%tjAaUb*Ov-f<3Qjli0UwDj=nmH~TVYz;E6gGgX+iL@CH zROMWtN_(aAPef;pz}^yR(*splqq0U|Z;7<&fhz1RGbdKgQ)P+2G>$b2bJp}gBD-Ig z#9{_*5~#wOihc&+M?(9xu5kaqv<#@yVdpxCe$vD5mMg#fmO9l5zAx5PtieX8ghB9k z)ny&za}CzX>(F{GzrOCOG%dgBo+*K~bLp~W^1j@cg!CUe9s-HVKdT;xdrPE^mO z@4;`;anJcgC_$L&Yjx{0N#rt8G^35lYqoHHBy_9x&)mBV+DKhLs<7P+$w4nvNa!AJ zwf~OMY8xH`RoI@RpF#L_y5G2S&A2c25|Z%iv_eAXL2zGU5~vzgNA)<|%VZv^+FMnw zagVHNE+v?orUw#LzgIN(?MRyhsKh7yFSQle`P_Ze6xu;iN_NM!V)l?>V> z!l`I35QBb_@Ir+|pDin7Jh_xlc(jx`an~W0Yr&-tbJK{29|`Tj^&=$D z{ch^|O;tvV6GC_~M?%MmYp{+-XnTdKjC9KzO6X9DF8`<#TFM_f?x{FM7v!2FQ@Tg5 zBWBAWx{R11e|i3k)zP{odT{t4_q~Z^xktlHD5;|5x%x$i5S|ATxGsjY>4B<@5mJ9|F2a72@H~*fbupw(58c9X`d~YVt)1zCgl45~U+#xLq?IBR5$GBVvLkPca+mTRjqN#IHkTyL~ zrRRVJ-x=(Uso75wo(B@@jk;vHOAl$&166u9dF-VZqeBSK0}1tJV6xn8h_vZ}Dn0-7 zr3{GBca~sO_sZgkv2V0 zrRTC-u0jZ%R(>SZo6N~_cQn$b2deZKp6f@Zgdh79)9edu^q(rQ4)UL`XC`5nk9SAhZk-MZFdP%V^LIL z*wN4QK;qN`Dn)Y?*c}>kFI1?)JU~C`kr68KmJB<8JsZ!ws-2(C4yVxo|J@|8l;CIy zON=D^y8l2z?h&Q?@~%>(O#)TwT~sv+3n2(osr&thYh`%PkE;{&#cwJ<+WvYzdcXqp z_vF=egW`dwh#^tnK9$miy9!0`@jp)}3tLxs+{Liel{)pgrt4P)-#s^%hv$2JH`T?`d^gru&QR!A)Au0pbJ@()G`&9p)lh8_LPm>;RH z!aH_t{TM9aSn^E|Brvu}n*^%f9!#g>Q)%D$V?)C)a{^NrX_LUT5>SKdtx~l)h5Rxn zu;e3c5~woMC!@tMiQ&!Oma%=GN(P27(@^=5`2HhBA1!OrhKCmadOx3}Z9rX;_Bv6Gd4yJ-6{8R_!lQOwdMEd}^UsCS|AEymN=FXD9`^q&SQt{Is+2hbPug{nsNXYdh zSB11e_~m+{ysx|JNY@+^452{?B(%y~@pNgEK$T7f?`Z}Sex15xVxt#b*yQ|5%uHE*TR zr6u9lX@x2sk6=I3L$1Tnz4)n>?8)ew^BnUgb3(4@5aF%+xU@-_Dq71T6{i*YWlqRZ z9}(XAl}nohsxS}a`c+s$y>WP4zCkY6^hw1fQN77}T)w?-ddM{ZQh8@)(zSPHCS4nE znaWy=gj}T{m3L;QOPe03Qm0g?wnUu)q5Mojm)+o!i1{xGzb++6=(^&qEmEjBZ%hJJ za>blfyx%MH)I~zqRBwgerKJb`&um3mrCUz#i2xFQO~~gs^b4QdB8wXcf1+NE?Jel{%B*xIDQdQ^JpgE?3;nBW-%13R|2^2|p6@DT$0zrGIJR zP^D9s`z7=Y6ZU=R`8E^N?{6IpkIuhZX z_v+H72dc0|)%g+9?y9F5bT99@3SZO8gzg!5EMa=+{(}kKUvd4=eUvd*lko_r;+`{W zL`J{sK98ahhK~ABrF&%W`Bzv%y;FT0&KXcGwOk`3g3kspW3KBU=ajC&oT8b>L%m0T zT%N;$H5GeQ(*p_hhCKB$bdCbjCV?vTzPpN3<^+aUkEwXnmwBEefiXwg3>B*Mc#cQj zStE3N&SM6oO%GII>l{M(bw8NVw!1rzD4)4^*6lp^qNWEDn4;LXn*^$`EM<+r97Nji z@XI|c6!wghZB)C9?Xf`!B;+m|qWSC{-TLsUIwpZC_4c|N>1BKp}CYqLgRON6xPA=h3h zw*16ZK8dAkes-(d664GoZgHL3X7FV&c|zRcG|eoWQg)XctlA zc6A!TartB&(+6|Y^gu$LGjLq4AtP-PsM39jcS0=1DWsGLB;=Yksk{?n>6&TN168{B z@lJ^SPePsVa$G+7LE7{{m2MOH^pg<6uiJJc)cG#QU47TU%W&J3 zHA0;TqrQBCwCRB=-COdQF>8c;!cTd?-!Vbj^gtEP6EY{{sw~}?pATVcC!d(m-}!lq z>4AiNrb8<4DG*(Uj`UH5y$t%99`e}@-OGD|Mc48P7C!}|YcEuOUD}b5tInk2=UfERKml55sPcq`kkpBXB-LQlVVYx=HAuEWzcuhyG{d}=|z@G}qjG=m9xA|Rib(6#YI zQO=6wlLq>QzqN&7mrot&@B9@l(*p_lM2S@VybfuTK$UzxL})bgpcmaPbV=4<r#S*daBi`Sa2DytpmddpJ$DKG?40syoLSm*bfIg~&mz&&%}9u=+83cYj3R3>!Xa zt~2!1F?-FT-0JIPB zZYz4GcSmc*mLYpmiWfDAa`DTZM{6CkFBLaw`fBJ)9j*CYlj>i%UBp5af2*(A)0DdU z`-83@eXEhuYIM8SyJt{Z<=VE)8Jcv=esx7{qs2j*-l?XT7m5C5H-Ezoi3Oi8b()n( zx4&vx)1axpC6BAG&)i*~2vp@eyTtiraJs!`R<$5vD-q`=Z`(7SLN#IG>(0T0>2~R& z1&ln{b8><6zl(J4&z$=y2d`16KHRgf!K>tf#MS5LJJlwo+n;=Yw?Wfaj>%(h=lQ#T zCl6F%$uM(})9Sm|cQxR&s&g>GS-6Ex1R7P<2s_3}hyp}RJvC@g9|{!`yQjrFbG}Qr zFBYn7&_YZiqE^}`4bsR1RaG0k;Y`Z&p7CRr8{?OiYrG!BX(T3x(_nAHXr9V_*`j~yxY08hnNB?TL zHHg?J$sgk9_2Dr`L#vFA#w$%xCly;&N&jPllWP59EbOD+o4LYS zI48|6*tkIq_E&TU-Am=HUv{N5S+k*~l`?6C^X{TF``kmO3TgT_xl`TxtyKNJg+()i zsM%nJQ|nNgy<|=OAdgq>#8@Q@*4z8#mz6A3VfvV%ni~Iz)vKS=wDI3QgSb^~g_HM4 zn!Rjs@CcyqT`lBj?5&LztzeaIKhRHzmicp8FO8_t_)_ui)=RV#DD}xy`@S&^VsN(* z?uHSfY0cu6y>!_AFCT1g5bqvZ;pBWS)jl-eq=lGsKEGAA&(?h-o`2GM=E4f+v*oGw ziBwaCG=0l7HmCJ_&8U4J^zCjC?_FNu^m{keUU|}_h4|&&yR7F@uk3xRVowWI*YB)w zT78#lkN!HC7|=Ak_2(Bko8&y+!}|G;70yc~)9kv(T@|&1JaR%>h^Ob}v(j%ZYjVYY z${>C|y25#@OPZaUVA4Xgpwu0>{-4IbQ|h7$OC^rGD6L8rx7zG_Z10My?G0iY<;}W5 zY4$Ip8>k&y6hgIQYx%v!tvW;;uGii|6_!`@6M{=3jZXaMs3gkLK)aiCFQdP(DoY~$ zoky8;ibv-b*0?$!?>*M8qV;ms70xf$QtTdc-4gDq_)eM@qP|tbdS&{g#%1ON;Md1 zibv}QtzRCj*?9Jhwic?eEzBvbA7&{z^vnm6X!zob27x1Qq=i5N zRq~qBhi6_UF>1*$>2dh`aTXFG^EQ{J?`;EtD%_uje$+eXTP?q4Uby}g3ke+EBW)6> zlGhXxo=2I493!iNvV|&~A<1i(_Vj)pi6eo2COvY~Dn36^hz5Ly0_}UFn!_Opndx~R zNT5nylS=K(!yR;w+&e6ZEy`XPXCZ;}Op`_eRq~oVc&=^|JAZ#)dPKeYqJ;#`CXf~a z2~^2z^5A*DN#t>I1~?wyx9n~q5i)ymY5GW{J3W<jRyK*;4W>ws5*t?ekieBRr0F~vAW$W*DIUC9XA;yRu!o<^FRQvbDfWof3)Si% z5&9YZn>$nN{-HJq)6Cs=aB`OoI+31gLV4OSOBpoRK*pL&a?(rznR+6gXz*DwiOMzWI;Y z>xL`~lU4>nv`$@38=>+%w2JS`d4PUl2#UwEaqoCx*CFIMZN2$!MyUME%6kF9=~nQ) zbq4Kucm%3A4`x5L=06B7Kb$7g56Ttq5$6zk9(*A~We{7bT)C;sgx>pM=D7fsF0bfk zc=+Wn>eLTm z`Tc7SYL#x!<()hthB#4s#|Tr4{d7R)qRK zC;FKu{Na6Ze>2i1fhu*azB6hPc)}kN_|yt%^Gv`{LOn4Vjk z-@$^jm;QsGbYnuk)8x`ZWOvW_rSsd9^xICXlKXc_<-PNjHG({tKw5~&?srVK^!+>u z_XTI1s!}Nuf;|4YQz;s0TC;S&WAYt+djR(#%YDxjcHSKw0YM&2AWfZydv^3schwKz zerkNvI|70{c>gxiLfq?q$7BwD#{_qI%YDHV58ewN0YM&2AT30fXViC0UZHPV;C^Gd zFPJ>MeaNoge-Pxs1kysxouN)1UPxyZ<9=hgFPQG@?L&6`{(~S7CXlAIg728%eq;Gw z8Qs@=@L zj;(z2$xWZIga}Kx`GK?$%jtU=>~S}JyGFlJ#knTmd?F7nC1D8>mLLx%kQU;xQ|db= zg?Duh=r^iZrOzhg(jJx&VF~hJ0%=(X<$4L%LH(u{tK{x+iU-%)u!IOpkOvb;)9N7A zJx;5XPYVU~u5?z(edy%Dtxs4&geAy>38aNMf7c-C@ofLklQQid5Xrhb2TZd6do%R%PUK-be_UR(TCth!U#oifz=7WR$DCUU}uW zE70#h2=ZV;mv;4TMm&8(i1VXU_WG8tAN-51ciuaZlvY_FI3DyCCDQbb6xEi90DTKW z*K=0s_JiL5jesBzCXg25h-wo>HX5Jk_KH=y9praZBOu6w38dw>Ipp&X`kt4i+g(=a z_MG2$j({K!CXn{}DDH7A-G8u3_e=a1b_4`@FoCqub6UDrW0mfagZ=)4aN~ir5RbTH zhBxW-Y~7#pef7wK(=7tR%@3rhQFq5aRT?l<+g4(f3ttMvGj>s8Yxk}Hp^bH{L`mz3rVE^D ztB%_J``r_hUA*bMweqN)uio1{PS>&Rew}X zwG#q4V*2Eq=e+ekefi|8oH2_Q&2_SsOSPMR!n+N7+F%9+uBYX_^l9ncdWWqK!4_bV=)Y&)1#J zA0M?hch4_Xn!tRb9y7=P_H|fP$0|0gp+WSxHQ(9$`%(MPamqu})PMB+ZC}q36|G8j zTUfy=9VbqO4C1b@e`xyKlG@gcUX2VQX2^W!qY^20(TDTO5NeusAyHbztS)K|yWPP; z6{Z!Yv=Dz*zO--9_~F)XZ@d@9ztn7W)SlJ4a7=uS#m=zCN9}WM3QLb>eUI8D-YY=m zYJBe4W_eP_SubxH9+myOMb6NuqxQ`u_Zuptg*clSv)BG?)<$KMhwH#tOKLnzX7`tMjQ?lPtyV@${p=lxh z9&xG3;Y-h0yVu@~LKW6K_Q)WP9UQj*l{-_c4!PDh;a`@NKWex6?!lP5hrHoDTk)vf z^4kYxJPy;}d)@m0rB&cYRI_TYO|habj6C>jT%41w>{0vEUyBoH_;N;>O=*rbZ&BJGeQ;n#HeOZU!H88+`rq0 zM2AMP&bcZ_?d^$0rH7_zcl4z{_iarXZ~fJ>cND5HpV=dWh_SNmt+Zpfb?fOZNyB58 zI8*x^wfEQ+G{*u)uS{3`%N(xr#{O6cw5Ci+8~{(8eHNvYesbSW7^ zO$#xh_wfDYyG*f~<%vCrDl8dT-e@aPYyW{k{aRSv9;q1MU!pD?wNqwPjVbM0?o6Z> zZr#MH(qrkHN9|f~RHoGZuEZeU>I03ef~#u<9y_zl`ROAnqj3)zDx_(hp+x%r!5_A< zS~n_b5YPOx)OnrysQwEo8?+EJr=;z_|JPpD;ix-F!78249NLUfO*`1#*L-6qYwX7R z14#Vy!BXeyqNDbUcPkG~3o*^QYj5g_XRSZxUQa?*a2d-W3S5}(Tbr2O8uV57z>$O% zPB-e8d>g9Cu;*x-Vt;u15qbR~eUInlvg(vp*5eNze0)nGtIQjn4I;VC3MV)9QJXI- zLeoNw{j0>mpFXZ=ks*iijAS%%=#wEp5>|Gx|EJLMf zA)5T;Kk#C;+SZ|ijRL5`T*I;;#NxUu_TCgZ0!yCiAxp`vmyXHUPVBhCxk1-^+?dxb zLtnp@F<$xvxk?^{cq z-^$Rp8s}GzF^RK8G;jTQpy92822rHvQYT0Abo)ZlN-;=NTXLXDvuA(q607@aIQxq{(LZo)_IHxds%s0EIN5up+n0S6VoYKk5sSO@5BxpNB$iZI z;(Y#My1lV!`52^y_@nnPP2;u=51j3`#qi)zwSFyKw$w<|*eAWh{s{|413HYCx%4%`+GS#prchOG(bRclVxaj8wG0mq z)u0vWs^0~gTDViqn=GC=F)%gnLz2*{_(^X#HJ2%wbH|ftQfklt5JAlMU8Ufr-ss=O~z!1{jS|U0S zvF7RZ2T+BfGKt=2#y0)t-id+luhxlL;w*LwElRf=uPq|)t3$%XNlIxRsR>bG-vj%f z%QZRh{<(jANPJ6UhHsap+gsf+gQkTjOGH%8$$|SS-}a#j<7CD>s?Cc{OO78N*g@mO zrNb9FyC5{P1$Gv6{ZE7xd^3O=OC$v)|OHB*$ z2@#w3jtLBU{k14mVVumEmuuFb>GJqqfv0Gk_)M*Z&e?YKM$M}GWTJo4HBC=Uhce5-RzAlJK< z4dRPD3!KJ9sYYG6TgFM#G(A9VoQ5q7|&tvE`U&5XFu!+h@JjEzoO09)q~j zWPvl0TDX~g)%;V_^p#^G&Q0qU*cX?_LKUW)nY#BZd1ddLPd*fAcfPrW?oX7Q?+l-L z%zo#^JV7ykVB5JSPY$P6x?T%|VEWZj$K-qvX(0xV+_3M*d-4Zv{qdwEv})(Yc}~j6 zWA^vi^2C_L^F(YWqWmS3C`#|zZKy-f&v)mFL7JXHep#YvmlJoAHoLP_?ZKgHm-m>Q zJ0nf+NBwYm-}~1;O`5!jRvf$yX7oBF>{sB8G`Svtv=GPkoND~*td&XhOizYNt9YeA ztW1+D1tu|j$;iFGmRoqRX^$zE(`v5Mwp5xuxmXTa`Z~~c{~|eJwltsX%)FUucgVr( z3hfi`oUIuE7U+e?`=y{We}x$$Rb@+1}9Imx=wW3F@ci8T8{J5zmqcj=EGl!TIrWn%(P0X<4IA(_ZI0Q_93#FPGqS`Cppt8&HObQrC9) z))X6QeQU3Zs(35j`8?k-+a921jYl3nW|w`xR7^#Y;B2CHMXV@A#LiRUqJL&K5y;g#V^*wj^ev2A!T~2-~>Ek!!omRz; z*|%G(vCsM@$Lwsy9*AkWI^KEofn)ZD7kDirfBT)jSDxr)UGDr(()j`L&h$Uh>`q10 zxP;>&{DouQ7#i>c>OJ9kYw+*{=gE<&cH-a)F(pPMIG??gYQH^75z7ar+SQ(9qW1Ky zzJIb$OIpxlj1{cXew^nSMBRy-eNA`2mQ?7_XoGlrT!QoF%2fN|Q_4fr)H3AV<(pL^ zZ&JSZCR(TpjzRc$W=xQg!gF|)jpA@_Lkn%A|3-P5$^qrhh zHSopoC`oA5lkF3n{}oELx4m61i1>?$uCG=NTpnc-eW>33Kzr!l`l@UU(o}YxjlQ9M z>IE+Msb_d_sJeelE2&g#k)}8AsqD7c&^!=Tpo%24Y9iJ70l%f#m#NO1#Bw4AEomOu zTEQgx)J||#{g7g>tXnn)Y1+#fy~Wq)&rX5n?Ftzl9IC4CrO1{6X<7qF+Ta^suw&q- zY(*rYRX55fI0sIp*omXc#F#|A>YII+st*i&vhs9P)cpz0%H$Ng{wme_Xqx?+#HGk~ zg+>|ucKUW->=CG3Ae)866>7T*rKi~A-L^~9w0=dz=>PQy{BwUc3so2@j1#@xKWwM3 z>_5W;cMh$KDoZU~(_JZcZnuTgA$jzVcxTd<6noG6C8^f#CZg7@;eq}~Orq6Y3C_O6 z6uag=)jn!kh;MFg_Vt}PFi^JeXHlraIGHh@_w7bstFn^=rM}$eYnm4Cy#98I{pohq ziatF(#lHQsn%&WU64{~(kurI^@6&>l0-GA#GKd^sQk>SO*p2ooLeoNQ&%fQb?x`_> zkz!g@uu6xWLzO`kxH;WdKW@y2gZ@?kp-rx-N65qU&VmEz^djsDGTYQUe zPYT@s<-UVRe7if|8BFQccePsO*0c~?_igsIeQX@^i>N%%hn;iJL z>#Sx-a1S?@JZ@31#)PJYI6-~wS|Tp=eytg*f^##2xWDO6-_6V81Ai50BUcS{czZ95 zcS=y{n?9phP|Wk(+~`XlI3{o+&oqP3DSEzH(HNwKSXg?8uTtevfu+ZmNP=^URja4Q zJ9Fu|+WV`5iEd?f_#Q1iD)9I}Ch_%@cxMTfcHc~sragBPxB6CA8W@HK^Zy{^u0? z_lv4O=k}5N^Sh~^Z})qO-H!Tssvm2%__jCh6j<2leuH?Ycf3>kvlRQUM70K>Y3iev zZ1$bK+$oT!eW5_GN{5i+ltJ9xXQ!{i@4W)WYTQghg2yORPNdkq-7$)$>5Ty*{`#|5 zV0GD>awMZw7;{WFA(l|gfBU6*VCa#`0d#NFD&FaIE5*Ln`2L`nw|IM#@6faL0xf&j zGYF=+hda5bU<}gqX7HS?zNlWc0&n{oNkXd|c) z)?|q2_hQjN`(N7!P=%qwI0^CMqAk8+@u!ng9vK*Txoo_%;DuD%{z=#VhMBb-m( zy^lgQxXn)AnW^6;O=|L-LF{-q-g(kawbx8naniI9S03BxOC9=MlFxcBfU4kB$RH~8 z+Uy%gHTGh^F@XZbbHDuAlsRM39(++fBg-|TO<9ela;N1mdS+@y;$fnc{FClNREABKof{nlyn3R0XGk_7kGl zi<^93e6`J&Mxlx$j|taP?U6opUp4Z+SC+A|v>u?+YSf(FzOTP%-t@~GCNYcXJ71;R zU%PSAv=AeRxRBp&dX5NGVVumEzf)kd??%39QNy1b6KF{}IK4`m-F~bJl@19L&vi?4 z%T>V+yL~g0N=EhnYl1=iMrqZ$D4k~1*QABGhlsZON=Cg-1ge5lLHp4;6D79z9!WSI z^=Gw#fzPS5+fUMcFR1(KkjQu}NOSApe?S84I+1$c;~LRY4(1%Txpv2 zeh`uShow=~{~Q@WRd6a~5ErxU@~u5x%<6rvUEng+?b+|9+4-iZx@|jYvh|thi+8GT zO|w5;TZqb46cH2CidhwYG>JXbuGE;8W*=Fj>Y%2Dxbwd)zHT&f{rUG!fnb$zW6Lqm zAe#QV)3DQd?2*_Atd&A#tsMYSvx2%bCZkT9X=(L%JpvBWo`doSz3j<=23b_41; zTm6z|kK3+#PE89j=DjVx=)9e*q}cldsKObx8S`&WZucd09b*-|^J>T%0IxIf7=;PF z9ze6ZZ`b&abscZj$o6!S@AY`+6Poug99T@MG=ZxLLPQ_j;VWp3wC;3UX%K5^?DI6O zU)-}=d1#v6uBo`g_jBoiR+~kqlY&(`eK=GZ#LDj%__hunX$_mP${;#Sj(1{m9kUAz zS00)c;>>d!eb>GoWEE=pQ4*?f{ld(T6{U9i*5sXRt@?1=!Qd4Zojy$H)fOSz)nDrS z`q3%Y{k>E7At83gJ8ftkru{fIdeyWLn*v*XkH$^10_D#fL=~>XnECO3uN}U^UB+0i z-F`J>rHJpVXDpmnylN!GvMsB9x1Jqol{vC9YV!qJlPN^1l_kA=W&+oogjmyehcCU> zcq?COH-iu~|9F#Dhb|?m`G@wSR`m1jz6SS9wwx2&e8DQ6J~|%kN9F3&9N%Z}j<g%4G@%4O!q*Wd5(6)iQ;dT_z% zkaaknK1^^a;WarS+HOwp?H|y~I#bJBxm!~(!P!rz;q9HR=Fys_b%xFF`R1(|WUVZ5 zG743=TE`w4M2+D)d=sf0^d!+W6_dZ>ATwdR1>{5W{G<(5)S5 zc7e&tL(@WxTmG(ZY1`V?gpmy`RN+0Y#|FG+*_PHUR~AdN z{pZx`AotE{1+qsHokAkoMcuydWozu{1gB+vI?G_AsY04oQpFx$xr^^c)fqV4Anv9W z&vET39s^98RtG!p_N|(JI_i&N1Fc{c_m-TS9FL4pwSFVccYVQzsI+y%4dTZa5}cyF z)9klvDMHgi^l7r&_i^ouQMJePu~3Ei%pMs;w@26ba`w!d^yZm~R_BQcj+I8^==+cG7j2NHV!4HKFU^*~kd zXi2S$LXDChNZ`IDO^14*N{`z(R9PeRelHylHHL#w3H}9Ddc2c$Lhp2ALert~K$RZv zWS!7^{Fu;ms0XU_I3eo%J@00|~v7hIA-_D*diR)(O3a$b_atJy50J;K(|m*ISv;bf^ca z^jis8C-jOr6Pgb7K$U(UBkP1-V`oCsp&qExZwzFe&`(d8&~&H=s`Q%=Sts;UASN^& z>VYb~n?LJ>eg?&arb9hYrQb2gl#smv5*$Lk2B7Is4^-)W^Xw6pkRC|r=Z;KhI@AMI zdjEf>g!DjyOAOD+nb35o2debG`AiAvfdrR)o?$bg=}-?;>D~O964C<+uE9KCWa)y$X`F%Uv*DnYw~?lWoDnez`+VF^S=`h z6-<+9!YcF&2^E{k)J5X6Z&ivS9U3ZB>Ga7u@$uFS4^4-9pi1X6dt^>zJDKK{KD~0o zM98WEo5`3Xv5Zc5{PTX5x|$9R6{;|AvPPVv6CNKNqdYVn>VYcE^9-Wp*p60@of{I5 z-6&%1IuPqjqto#Z^eG)P{zR;^idGHQ$CZvb+b+(TxH;8+{tsTQJw2+U_W3k#T+UX=hRx8YF8RsCZKh{<_o9_%#L-|6-l$-`!twnNnek6^z^Ly#pvr1f&6jK zOK+#z-J6*q!4T4W+ao(#+3#DnXGu1bxOzR-=}B#3|2!rw#PctAwCq*I_l~?;#6s2H zA7Y)$t5fZ&pOg-Y`I{7~T%R=Evz)%PvFF=Z=kC&J_E%|UiegF&kxpN5X%OEeu@Qa2 z1&IPzW1T~kAJ2(0LHW^XNJs1L>uVb>%v01tRh7JPP7>v2_4>iYsOLIb)y`IE{88be zR?m-P9h+jic7+*sj1zrbh0I z*%a&iLp!j)tshM6d!eH>_Lc38oP0&Cm!jgFHXG>8`;;;19LnunDwO}jKQ9$jqh1)_(K;2KC-IYOMJ!a6n;7eiqBg4H zd%?uHS2|i_K3&?F0&SgrI?lOkTdLiwaM_q+@o~RM4Qd}>AwRS1 zuA`VAN{iWZh1x4a1tBzv?NoL*PqgLKLKS_h8k=iT9ER61``}In8fSU%SYp=>!^TuO2z@S;L~# zwxjCOf;eaTrBr**reLDtAgbpp_9iA$*&X{voa6kQYX808R3S~f4Tp8Kn)RO5pma`? zXps;n$0dIqGHE(DYC=b=z~fPkC;nB$LKWt@nO2=+J6birIn;RZ$3?8zxl~H%iOI%Q zW+^EZOQEGVJErd9QZiva*N=^jH=Z$xL;g6Y>)}-U(iD@XGyAE2{1G)ev0Oo_=b*yU zhaseMAp3W;E)zpsG<7@iwY52b)2C=C;D!X?oJ-??g)pJx`?H23Q$em`NZy!voqn0}DgE|erqLvzoIz&|3n`*z` zwp0w#bRGc3V{7{=4Hr>7P*uBitdn#*)t+7^m>5az)#E2V*fXBmDQKE{r_%-674}OoQM!9atM>dy_Y|vO60?ZN^GT}x5D`cV zQD}Qd>$hDKc0ciM5errK)sA)MeNQdwSHZ+%T{>D{`nxu+^hi;IxLGUKIYup9XCjd1 zaU%ay^R;66UUCGzlfSK1!|458#>nd!+m4>wY_zqwN@t5k{O>l?Ik&>pCg z-w-Chisxe@ChDm#5WBSD;m^2lz3Am{jPv4=@%I?{C4r2XXZ%txx>23+lHhnCZF->U z*cL@_`eaH7B$|Kovh?7TM%wTYsM@qk5#K!BGIPR@#KzGRrAPiIO`?%DJy6y9?Fo|T zcDZ%tgdd6e-%XOl=Z&MHkv2V0)pNKC)uAfwGAH~y^ii-?~O4ZF-<;(-q}W>3q-32|p5_?Nc61AZ>b}N{8f+K7F!CXuozJ_47i- zwDj=nwggo=Mc;DzhZ2OT77huWZo}pd_EMK=GajhYC8P5B=R*lER7mLjuXujAS4x;R zJy4}f_?*}wp@ipwgf7ReW5;-M0FPUxPRrs;65}q}pe4Y`K z;QE2I>4B=7FRM^-P0bpyJbjq-;Cha<>4B=Hr&Or8#mO4+Zu(H^!R-~&rU$C>cUK&$CA85ORNxwCRB=ojyD+$r_HD79*C&gF4k7m+NJ|et%_d}NN0m;|q!9x`3Bp1NozmP7B5iu0 zDx+kCAv_Nxbcx~q9BJv{5vbB7eC?M*LkYi*2NJsE^SA_Q(*sqyrdI4cGL-Nn168^m{IdGkP{Q*-Lbs?q-bLEb}YU34Jha-Z^Ri=bm zxpVI;=bv;f=N~{D9s*VKuh2Ri5nMme&mhz~oO@q6kEUy`A4nU7K-J)nX&sITuIHH& zY8}qKuUrqHYp&-=n;xi&n@(#>L{vIIICDa+!@2jB>l$>;?G@6d2db9loh&`L-OZFx z>u~OU<@yX=bGwVQ>4B;d-IWLTADI$r9nQV4TxX(d?mv(=Jy5k_wDRCyEmK0R!@2jB zD{OSl1k$Dls`P!iKhGMWL&*I((xwNhbo%hPBx{6DX&#p#ZF-<8BcD5Dk7m;zR_S(-=L6`MIiXuro_`>15~$Mc`Q2@!vq}Q5b|H6dscR3zNn*^%#$b$1DYlI#@aDE^yM8zhLTR)9o z(|AUaLV+gTXE*~-(>Ept&5gb@eui8xnYV3D^n#aWIM1F-v3s7JL-8p1X$NcO@*_YwHr1l~!AFYaz*jp|y!m-Y`P3pwO1Df5&xTPTf4V3^Bp}~(ID;`HQkv(yK$#pTM&&jogwtU zrtqfLrP%CY5+xoUU@dI5p-KKqUnkA%KGWIVEY&WbI6eB>yqPjo74uDt z9{$oyXJXe>d(8LKD6Kx}IMDjv4?i|edFE^qs(zg`)0x>j)!rE!OswtooHgt8+@=e9 z|CD4ko#{B0X#eiU8HNXX3t}mFS)XgMRVM)X^6ynzxx?06| z+_SHJ?|TABd`D$>^_MBOMP(OhAr5!wYLzFV&D?tesKOF%5}S!>s8!+BW+u`>v!` zZ_adHj8C=8j5k$C)0u$jL#_GaUu{<7@kE1|xnQO=-b<$Xfi#_L)N7E{DWz&+_pd%nLKW5z zljxl1S*z-uJO@5$cQZ-m6t&3QM%_DWh7zP&3sJM^GuGAm1rK)3aXSf#?H6Y_M-HXgcb$AK$YaKHy{-O% zl?R4IT}?vOTg7KObLh?cv1{BK<%OzVLSO58(Gmx~sCzN#NYqT{_juZ8x4^CEt_o@T zD&oB7tS^>K+287|9}VJg&zVmDskDE4o!b(59wl21u$C@evhV2TuaZ#p=$M(#q(SuV z{HJbyc*LqR1FeF4-${JC;1@|pXU}v_(VOr&Dw`^#DO8U>Z?#)owb8U6KQ;)?%`&ai zGV=t<>jm*^j)L}EV)D-qs%?3n5kOvb;(?e{oeWZ&e-x zHgt)EAesrJ=^WuW84v$2yDCS?UtHCtF3Mwc7dt#5!V*L?fi!(%>f_r|i7rqDJ07KK6bJid|8#_pX3DBO80KXIE@z@4aIOY-fSR-m&*n zL1E*?#x98c#NPERXSuWMdB10po#mN@uRr0heUZ;QpCmJx%slf<0&j11eDAL3gaa{G zj?RGnCg|h-z)k#jyz;7gKY!!@@%sP&KO#XVFil7w$JfmJ2hO${TMSjL9)`z*#zXy6 zLnJ7iz%(Iw9bYUQ(l^m+Y%x?h{(_t$IFAyy$E1o#&sP%2|9sk_+rS^1Nzs@*Mo<##ZdVK@Yzt~JW?b`%7k%*nAWeA{-tq#t&A;( z>Pr_s`)ZU&iUdiSFs?MF!K07yHS+-Ynz^yXQ0*VfXDy9-l_Eh>CX5<`X?RCG+7Hmcwiv3n zm4@gZycJE6ASn|@i;8LZeiYOv?lCNAw$<2Ts5)*Qtb6e1M~VbVnSjy+0@H*XgZqMe zEQfEC8(R$3p0S1pk5i{ekdz7I35RK?2PaI%7DFZW+cl^?v{y-f{~wW{a01iLYsJr; ziu2$qaeexaZk{S4LE!|Zon_8Tkc#r)DpAg*Zr4v0k)Ut_)6TlfYa$c%imOC@U7C)j zibzm6fob?+h;a{+!s%-=aer`?xbME^uahbwLE!|Z;jQwHubJ#47raM8cw`xX5*UXN2l821OJiGJ_#OBI`;CKLTczF*N}<@aN12;)A-wA80& zqQA@cEBevAT}cgLv{#sx#s*aM+xdRQ2!gkdsUeJZ7t_)hhl=qB->(?g@OC~mgz@~q zv^4TEiE$L)FCL$zhA^IRnC7L;|BN*axRo(xd*IudFuP>Tn5J!|rR5`mb&tpTQG53Dj~b>sD{$^S_NVgk1Yn3g@T%9x#w zSNLrB|0Du2fm;Ji%N|%|%(C%+5mk`aIztq&%|b>pKVOv~qiRY~P6@_phJ?k67=CPex3(H*8`53CY3 zoM%%dBLc;FU_#VmK1#*3?15F{zT;V8$q1(hCdB>7N86Z|J+Ml&A3VD)8R7K6glJcI zYzfn{2Udx8kZ0*7Bb*+X5bYz6En!;rz$($6^K8Rpgwq2PqMhf_C``*9SS6l5C2vni zPB=YMB6u_k)3S%y!d2q=nv^xk@A(Nv-383JKQJMl)cia!Eqh><=qK><_%TBCA9#6S zTK2#yBcC>2&zk%(LX6LNy~4EYfmKFcFvMiw{`fIMj5GQDfoa(TtBm|+h+n~d{$qp~ zFZ25x)3OIv8F|{goCp0NA;$f@y~4EYfmKGnxzP^(7$M>pyxqmL?15EA-h8~mpC3O) zh&T*?eqdVmz$zpE-*^uGD3KH$!nEvxV@P7Z{CWOkgg8Rp>&LY0fmP!A@T|!nBgB>F zqZdre9$1xB&MkkC5H*I6!Z0m+V3nxhyr1}EgsAy^G>K{11FOV+$FnAXj1YG)9~EO- z_P{F9e(=1$SK{|^B(qnyArA!8bj*GG>%=gqc?j9;$OGjqX%=ToPG01r-Jnhg{Oi54^Chj-bdz`AB=@L3X$=vua9xOXM*Rqr-A?vPUv~PaD@Cfd@;l^ zKlm2nqax#%Z_zVzLB;d*Q$c_SCooOO>MO?lU>TTW5gET+rDx`X2VZZH3IaUz6$*~G zhVb8nwCQcc$dx%u$GpU#`-7PT=8OZ{qO#e+cm41g7DuZASn`#^1!rSg1QGUbCDO!_p7gC z0uNsPDH0?_0z5c@X}#{M&@u+{x{KFG>Fcq;gV*B}36dfK9-P25d|wUb=DElAbTw7H z&P!ic1|Ix=Opzcd65zoJOzUll?!nspxOKfCncq4Q)G` z9~93It`g5B=Xw*k=lTEt9|Am_D_`{1t_BcC0*z;FxO0BcP>Cn9tKa`aIL-sp`nA&M z2l=%U&vU+C(NEylEfs{LJTR@7x$eQsT=Yx$eno$Wmwze<@Zbcdr9K=J{VT2#{We~Y zQ$c_SCom0fp>^~{O&M!4(NE+m(f{Q4V=4&n-~^_nJ~b2lU9J-SXx^@*f&dRrV49Fb z$JpS0w?r!X?OY|s1H64q1pywMz%+ap*)hi1Hg7f+;}5P9;~L)1r-A?vPGCA|fh@tgVtw8bpoYBI&RS+nFya2+01_3CR95X7wHW)#KvuJ1P6qp!IxFCxKN)Bpu4Uw#XM11Z02m zo<4!>Pa`|Qv0ptd4!@JKKMh*X7j+U?Wkk~BQXnAvQzsxl(a5rJ>{pMA!|$Z*PlI;m zK=O=6Blp9hG9u}5DG-qT$ul#_I(XvX{fehrQue1o>-nNi0;}}ja7QI4Ap4VNmF zr;+snN5xfoB;9d@nAY<}odi}Hv3KK0WWtdt8_3Tb6MEbSJa~Cv+L>Fc6If+Lii|7j zLO_p_p9kb}8d*q={pyh^_|0nxruBSLCxKN)EX$}FG6C72jC(*Xr;$zN*smU8gWtTi zV_MG_brM)*#N>?nDiaGJ+l6~{fy^^Z=#fJ3;CC&i3Bd$b8L>s$(vESr`<67x?ub2>5n#bEQ?Yve=nX+)UTqUkga>7yO zdj2lnuPA>WZ^yK=%#$*H!Go(rIVUF^HBrw)#`_iZn8({O?X0^=nakk8RieHoCm{Qi z*F;hTGO+P}#r??R?U>f{MV$mziTf@&ard$j<%H}{Bg-3(imOCR#N+LlhG#7zuu8Na z$%%JHn@Flc{{$1FMdk5!Ov5@aL|~O@2a^+!{mENVp3!Jz-NSism1yUAb|a<<&lhzP zSS8x?5R^0Gh_1QX&3$Md8x4e@qFV3l|-B_|;JQ-5-D4@`*XZc_GVoSw<0XMZ{g ztP;=jx$AsuP@mhjuSnGob ztP=gJ-`*NU%j!}}HE9sV@Hv^2&s*2IAaSBa5OaspQB=^lKg9^S8>Sp_tI z4q{pws~Kzi94aFh%Xkj{Pr{UJzd-ZnIi`7Olfbu=513&7gQX!6`nNJN7N6svhOE|V z?X)S+1{uHkx4roPb%LZ!L`a074UaW*X4C!9+u$Bz3-`!0!KQR;I9KvBJW?hiBtp=J z$Dp2x)E|0H+(T^P9;C5N*|lq)?jinfc%)3gRX~LJZFuB@9$yImCw8QYIoaOo-oxhd0D!PQVC~dx$OkJUl!?D8y?vYw_$%? zbk{w^7VdE@F;>aAVUg}3{%?4sOhib8pdIItb^x0>Ad&L(5L>uM2Q5|^xnYU!A^z_; zj}(ari4e5m0kc=^K0FV(huFeB*8Uc&^t-%V_YnU#JW?hiBtp=J$8oqf%8WW-;vQlP z_aOV=S``o1J;eVFkCX|hSBMb5lZYOp4#aQ|u|=Fm#L!i`hxq^Z2;&F^!H_ca@)q*up({eGTcjS@#hC{~lr7AA%6HL0I4(Yz6a#+(T^P9{j#@+Z&;K zi2r|&Fz#SM2-+aVz#5Px&;#HeVhi`+?MKhhZMui}|Mv)^y%L0=4dN-ZiQce|kb8(N z+=I7+`@U?~J;eXNM;I-tAOvj?IiPJn0drs6Lu}z5yqzz8b%*XD{{KC~crpk=&<5dn z;^-b?i+-)(xs;*!PTfQN|9b>n1w@G7P9lcq0qEBXsqFBDO>tB|LPTho5Wk&gZWY%` zY~knesS$i_(@`Gc|KB4bBtp;z0cCC#WiGbp*9yJ|DQb!M|Mv*ER)`S44Fc+}D(bG- z!aWAScP&M27ythr5g`$RHi)!v|2=|;DlZSQg?rqMwL9-~@&E4;5fUM2gBY;CjXLj| z(UyoU+@s+WJ3I%C)<^vRdqjjp2-+ZE9hsU1#t8g8#1`(c^IyBO-4*};9uXlCf;I?f z+f~uFi!I!vceXhF34r~+M?^@3pbY|^YN~ifi7kA;Bv+jCIVk@BJp$?#BE;_`LOg55 z7I7Zpc`p9{J;FE-LGYvEzYT(Cyof%7*dnfv=$DB9e~&QALlFF`^WO&XFO>N*c!vTn zbFqbc80BpAuf+eqM~E6@5P~*{nNWB8UNib|Vhi`+^;Pr}#s9xY825)D1Z@zDVD#7- zBB}g5#1`(s?>o`o761PpVcfxj5VS!+4_Os`YO#fT@b*LW+r|ICM;PsuAOvj?(9^ey zv4PmaJ$O4P#vkJU-y@86R}g|W2pF+g#TZ9y;U2s_7vm`L|L+mT^Ft7VHVAkQ@@JG@ z9%74rtsLVs?Dsvwcn*q@9vqd2qk)6L|C@=;Q=e@p8^ke2ud_ zxZn2)F-qa*A?W0Uq=Nh7*G0xy?Z*f)O3^(WbaD@@;`dzv`#R_S!Tr8Zh*1jn5Oi_^ zs|d6o+3o9fj~^t^s7TPsJ;YdsA4#L_Hf8f%qYw9Egczk@I=Kf{)j0`oa{X+02*2+W zVwA!?1f86~Dr3yCQNLEHA&gOxpp$!uu?#jmO_9(&Fo8!ef==#%RZFMZ_4b_Cw-gE80~2DD!U;hq_rNL=2;)J=b1+3h_mBuY z#&OV2k3jy5yNj`mI1=$Z7k*BH|42rNQ3|G=M4%wBieDemFX89G{hS2SMBx7>@C+7zn{Kje zrSI2J@#m{J58?NHfwb#-=wDH-IIb?sk~Ubo0QcRf3C1{6+(pgO z2Wyq#|K7uY1)|A==8;>TO=Qdd>~5_QHcy)dJ^F5r5rpX7&&nO7oo@hNvyWd1MAXG$ zNABO9&U^=ajrNB3$Yy|XMtVnkF2*=t-p|!K!vDvg2?t{I>Hi{sPB)d+_*e*{I7#EB zb8qHq*Fg2HfW^Om?RlC7ydUYU=&9`weXhXR{O3V@t|*D%zl8^;2}umUU3=+<>Fmkb zt~w!9f6SY!6Q%Qp`^!YzOT&&_eK?)@Uw$5q_lwU7(@@uEHj7Mzqv|y1K#c3P5`N-n zjZsnc&mICmw}-iqudAUv%5OUvSvtc2wxBDI zq$Uykw-^awnvkCloQh0awlkx@X3{-`YVn|8P3vY;x?Wo&`4MtpbOGNKbDQ^vc!s2 z_@3Y%!jF)7o3}>(xvvdl*WJ}TdxEtYFj8E!P#$OMSK2v(>~go7AH7SN)lyC(I&BWt zKKFrA8zs|(_~jqw8$PW$Ta%`sidDEgaB0FDxo0f(ogJN-^%>GhFF`R0;Wrh~6 zoNc|oy>WaC9ZPr6AsWfVEDc7&8_m_#S`^(pvRH+c#x3ZZ!vRH_gZjw!zbHx}hizAeeYUf>3Kj=o)i4Y^QP zBDOsa)_M-JDV@r@j_9*q+ZH*iGi7}%l~=JUS@}E5yz<)Dz9osMEdc+Z>; z(fr}bS>eM5|AA_V*5Q~(lx6o^l{&Bh1W{xe%i5 zdumhK7d9dVVieDbq|x@?Ic1}+R#2k5e36OWK>v5grc^8{(}Yx?Qzohptdiag9Y|r4U!Q9{hs8_Bk5x>x{u9GP8s)6sajd!d! zoBX1l4++t3m9Q)J(#C!Tf%im6qlMPP!P+TnCa)n9u^(zXCxRR?GC@Pm;QTX(;jXo| zg1gpLCC-)~RT6Rc-gMv2(H85S>0=}UmjNdP4O#bat%}b4XtiDJskaQgZ^$EpJ$r>{ z{cG5jyX)5b<7-IB{02LGY9_j?9pK%|_?qzFB1VE~s3p1o_Ng)0P0hEjtxgElhZ-ST zE`PgHE|2U-$nF>8eeT_;toF&`tNunpwCLt`g^V{^PC-|F8?2RX1%1@E>!4oEXj&qw zcw!0l<4r{(Ruu}-jzN$0&Ka2|*G8rAbdG@D zi(eo35)JfTxJpEB^xw{yOz#d=BNy*(s_yAiSR#7Bvwa?nWpg`X$byExPr53RZ{TV3 z4rbk5RpQLCA0cyRH}xCdpqaX4O(BWcaWGiB))~GMv)bqZ2pYcH7*X+m088AWLMgGb?x;(`2^G-uigloZM~l@ zNEONXhOav*7n`=evn$o zKhBC(_=?Kc>U5p0M=ZyttBdpd#h6OW(;82=D>ZUE#siKhS7sPreS-g|h4B@1M?$*V0TP-n86Rcm6B*ia?Qn{qPw^ z-khtAg|lth(&Dd=yx=PEaT~-hPDC8Bo}I4JfMO<0;A6)$lsOyh+be3SYOb4EA9IQ` zw81!Y5}e0xFwT^T%H=~N`L%-4oiT!RiBt0U9;OKi8yXt<_x7pk=L}hO4}OMRHM9Oa ztvdYvslF?bQ1YAa;{)B)%aLiAsBt`oxUxl%)(7s1JzmTF*HsJB&JBe))AVI<=8dkE zkJ@F_UEM=O0YzQn(Lqc@c}%Vlb!u!kHL+M)-9yCm7L9?stDjxjyLzb$(W1Z{pPf4f zsP7hEp{M?wr>z_V$3DcEaTR{@QFXj=HL~2gk?Qmc+hyYXJk1C0!HS1vnvk)%u0{@m z`+R8_WSF|B#C5}01iqHm@VM_H`$)BG^=%U2v1y)GZX#T(x}kb2A!v9Td&u!Rqqj^@ z>+Kp%u?m+5_edfVd;S#px6x83i!Vv_ru7F>boX&*{EwlT9vkT z<*KJK%Pt5Uc_C!V^;eOm(M-+rPg#k`dl1@Mcz*o*n@kh(y4K6cNO(rgzV6PFsi2mK zh_LV@z&^>-{+QUm#ujjR^eKL>lm~? z{XC+=q0it3EB0KYQR4b=LPVyZ&rtKQ@BBUK)q^j)NW_y;!P*WVyK*McHCo$pTK+oA z_ZCoFMmJ|zg=1E7c^v9jGwSaiiPr9rt?n9C6Gy@c-oN6JLa2#VGW)HJ*x~rOU-Xs^R@5KunNcCF1<>LW-n1#(9Wi7oJ|lXb5)5bFh8m!;%WV~QHyWBkFI-PCj7yJkD~&- z9pwR|A|A7b6^EJ9@^MrQywi!fs>Bu5%fm_RJh;xcN&JWC_xEHX!;E09_Fp#TR9VAA z(1d(gwKVc_jx5%$P##$2TAE2j$M6ikwPw$zx1r3ZjSANG9I+`|M$1>1A5~He`9sMt zpQAxz=rhX%iAWe5to;S!{x`j48m=ys;12)lG;{VT46AUd$yc{={?m2d1iqm4a`a(k zT0rD?g-sb&))7N?M7I6R!CLlZ5DDqVW60%)nS2-Ii=*5B8zd2%dqa)cW>czZj`DEO z@Rt8vhw8lUkx0A2J?N?uXRDWolbBtrapah$E9v9{Vv1Apzt zk>MUI>80Xh7*@Gn=_KM$k959`V4Y$f$Z>C5B3NrO$EMJS@|p9a;&C6NZTA}TI&wpc zjI8jR&Jv+P?A;xX{ozEJCS(o}5k48&z<)b4tio4RKJ&b@2lHwx|#@wQ0t% z%JoVo5m`sSh%7>Su{w3$(th28w6-1LJFG94>d$ZVjy{Tsl_*L$n?;e`9Y1%tE` zt!zrBv#w{pqU?Jg9-*J#mFK-0QF-yy=kageXT&ri?Is=esqQ|IO|f6n38Aulg|7)h z?7dPYS7JNN%KY(d3OhEWF#WqNj6W2cVk%i{aE~t&^>c<1Ea0aD60!c=JS`E< zJlxT<6f_|vfiUMB!EPk(r&xv0oO>h@&pPL2eCjfwS}XRgAAF^d#3@a;uJzY{!<#Ai z??!*k(GGvJD<3NJSa{iNwb=CEMjc!IwK{7*5@wX(+kgYFZSZe5622!4Ukxp{Zj1k; zeDk!~f7z8*wKfAWCfJXyNc-qmG^->Loz~6Mj$ViOOy3BJCS>@*N^H&ENk{+i^kXFt z&(+erhq#Dsqd)eOJ?dR3#crPN;xoFkSt1^cn5)Hqg7M&u4H6BJA|N&cQ4I*JN@zA$ zyZ8mhncZB8o1_Knqs{lr->v|=+$KnynA@i0I=J2c^{gOma2Z$)7`?-vlnI9KFrQM& zE!hKSPCZ()OxMc!y(;R#{)!0FPWsxEh-o_|l|+*b8{4uoc~ALlaW5->t)&l)RrU?mc(wXhb-KA+SL zDtokpPY#Av{x^fPF+CwG?2s$rm90Hn8Z!5&d3a7nql2^;I zp*cI2Va2hvnG3Sz@Knpa&93Boz1=8hhf1Q!wzN&zFu$|M3eh4Gv8rT{*8Z4XS#fEb zM8ns)Mzmt}&)+^eFhE=%rk%@?A4Vg!cSz!mefdJkijl}#gzV}}-ppZO(ao;Lq#tWxG7 zZ+C6&srhpDI9L1iY^-u*r^+?V2B_yI3T-|l=VwKh6>N>pP9gR?ed3t|7G7m}+t8i<8{Rp{S zvjKA(P`d82n%)x8A%Bpj5y;V4>Zm2ocK2=3ChXY#`+k!HiZZOitv2=}B;)uZtVTd? z-{)7Gu%`{@YF|#oDtDSWo&d04{)EeXdXBdGc&ri=#Uu2qUzTDsPtS|0o!2Z8XW)s` zrkh~J~V4u>Bh^?G^e zNA>bis}zV+I)Q0I(zSi4zc=c!S3hQKF;wqw&eT2JYOnB5ksv7(rxZ?L8fGoOS#*!x zW5+OKi=pas6W*%_$G#^jEMnK({F`E7`O3G24Td5`p`om?k6})RM1DIv(2swFIm5a)ze?uU9hB|43H7 zUOg+*F$E$nsa`qg6zUc9iur!^@&}c(UbzxU^-3b(E#0DCIp`GX6%bsdmouoG^~#k< zs#g*bmsGDDbPDwf2)a%!@crsF160m>^@BuQQoVA} z5b+v0QZK=(m3LULJvVyW&7R%%ufH}#?*TMTbJbt}KM?%?{|^Bz5hpNBh}+xAy2tv? zHLdyrpVV#GaSm9j}1~JNQwl|`uL2GKO8h6TLyK}J=V|5z;NF{ z8gocQz5AV6vr=KTqx)r)2t3A-XtLmOcfH;H_tSJ{+!IC(-~EVx(>qQXd0xI(V3djo ztTKKlq(Gd!?5#gP;toz>nD7}lO84k?aJfIG3Bd$b8NU;h>5&W*7c21Z zZO19U4P5GvX+ki8RmSgx6o@B_KItBx=JjNlcXk!f5V0u`xR&7k>g5cyvtEG*_e-H(IaCG# zy>L+zodm8Wc)xl%1MRFOKyW&RdgV|VL~IHKt|fTCdMyFkSxdl!`=wB?94do|O@TNW z+KnAlpC9e{EDZ}>9-_Igv?;l3r#0uw32i&jc{&jD_4y&%;d3^{w@_L$j5!Z=)oc5g zKIz!Le;^a=cUWuJCY?b*TgwUlf8Or$|3jbQX*-s2^DDmsYja8j&xf18%C4Mzr_UTWkrbAt|q+8pnvoJ&pB9OgROr{ChP^l+da66api?g38R^jWTUpMD@EZl9p z?=|Zkcm2%y73J4tGGrclSA`V=m(uFjs?oPt$F+)tt9zj6nWJwUS62|YJTMKh*WWv` z-B*_$n-H6YVO51~AzCqr>E9ibR`MgHSd%VHDW)8|5|cq9aQR~zW&yec=w%)h_MT!7 ze75*15E5KwxK8ZfbXX$FjxhRj3(J1?$FxjfmHr#9Xma9CcfAi6XnE~VF%ehD@c7v7 zAAd~4yfY%OO8*TW$%&>P^gdi*>G^Z&Vj?Jy;Stc|g+HbV!30+6zriCp;d_1xzgFbW zT*a-JSkcAsI6Cc-Kc?Yr(}=(-{Wo|dCrYFprF&fZJHmaP0`ptNl9M+gzvD=TWeRVvtM|QhZNly4R{%*Ebr(u;C!x=_d8rmRg<;jIw-)Vph^lqX;Y!3W zI%u+nl~uQlrmPnY*B-$;GB(~RX2t~G6CsBt7NLhPnAASiN=w8PDCb|E$148}lxadN zZ4*sRdi$zg{VFo7B9ATF_Ls3r&7rQuhu(Kh!y(`2ngSkG!?pE~VwH8(iSx!L0xt`3&W~}6Bey~LaegnA6G*0 zxo7$eKvBDOR=JXVLB+k5#S|l>G?l)vO9l+iIw)uG=9I#lBiJzeBM~reBJf zF%84h1z${q*A7;@=CV?(8obJ)odu#(RafF`^M|HiOO8VHU0XwpgW0 zZC4^B*K^Zt-zn;yGij)w-J&ht1Z8lbpcxZ*Pq5;!U0r%(7OZ-?{=P0ILSro2c%Z-j zS3sf(c`-53RQlOe^~ACzCan7Kvqf7Q0ez85vLCEC^m=VtRB@Ub{BcL!`-d&sAlPs3 z4F$}Yz5{p(4YT}%^`OKKWdxB?FCNquLJwlC2yF?;3%&=$+ zj>IY_*5{RILN;Hwn+9JWr*2(2*@{(@+~CX)$0|iVWj{iW*H24tPZ*^(JQ-%aJKdtK zfP33CFRvLBcux=szF?->%Kqxq3MV9D`EZL?2xc>~T0A70ki*YoO-F7GQ>#_lZ^f#( zFJW3Oc=zXl3bG#|d&Zfm*}t1=E%UcT-2TO)O+Oc_1bBFuF-^$R4}`{+>8mz#yJN+w z&QHR$v*%-#<4s(Nhj+5j{A0VTjfZ@&ZVRwzRsV=p-bUszV*>99+AF(1EpxA>de8oo ziit|?EZV?7;qAsRb4xTK^}F6T4cXjL?U^}~idAhdhiP&5VwFu3WIxC~pHYuCeacj? z(Owdfy_H34{tCW#w=cID)9~bM=t0B2Hdb2{EU04DEe$;0#wyp2x)Kqq+~~!X_0+68 zN~m=jS+v$)W0em+xy_isdm^NC7DgYhsH{fks38%NbuC(;8;s~yx=S?lK?{8|{hrZB zCD|*fSoPDvFl|^Cn^M?K_9LXh>y~uFZyxHSB26UXp|3>?$ZJ!)r@5Ok4d1()QiGba zc&Z1+D=Jof2oKX{)r6z^=H^1Yx|od~ZkJbGPn)adDp<6YCYw@owVN3ecu$19|E(cy z5qIC3Eq8!K94u$ieumti&2wZL)-?QHgZ3%*k2UH@Hx;WU%?Z=AzBVOGEmz{CM_#&e z!UO9)|K94PVixUJ$i+~e{i}AV4n8162KK0e2wBo~+wEOW95|PQ%qNQzSSB^ow!ZfsS-K)}> zrz5D>o1rRJ6`dQVmFR9)7T0xiAtKIEns(<(nytfdSZ!g^l%L^j|H@^?1l|)NHxGNz z5dn{B_uyUJyT~(~QwIWPwz5w2On#tXTSo2>) zTKM=QdZ9&6i8unSM5Wnw<@9DZGo}f-y6e4Z=%ixoijmWY3#g$vnkSF%obH)9%dqbjtbJqzb!#j-b6ry4wkxfnUxH~u zChti{w}$p%*V5k8`z1m(=5v_#`m0@uERxrSD6+(#_TJT%Jsk1Y8V0@lHy`av^B@m1 zCa@nwKio6X;f)5cbr7AvM9XOw&73h#$u%OcM8nFk8%60-zoG1gve$}L{c~Eh^_k<8 zYnk%75WPO9r8m}&WXJzqB@tVoFWMQ192@eQF-=HKw?xyMtmD|tJu|IX)wiTY8}1gT zWcV+i3(?t0n#OnK6O)1YdAD`OQ>&?gX|xds~UP2>td( z`QUqyjq^)1tXTKWO=m2a#Ez%SYsIPx(38mn#OME9iQ5zE(P9(Eu}!ZVTKzUyvsr&;=&#HCFu})8)4?MfDQLztL~$1VWmSHyb zx-iJ1dBHjT_ERAjqJL;z+CO|U3u@B8uIY?L`wjNHH>jW)6W9+{tnYnpx_M*@3!Hx6 zgbB-ai#8F?W3#1@L=!UoT0S}^Y$DrfElaWL71XOqx#N^lxeL1xx$ZtPEonP}%|6vl zBFHTmbHaJNi7aHsG|U_1JYp(Ue;lh*0=`>>RQmiy1d)_})Qh@@tMw=A~3Tg;3JyeH_rwzy;J)vgMQ zo?KfZhBpn@z8wmo!!>R@OAVNP2-U%4&rqR#nld%Ep@!)VRZ-8CdRK?qj3A`uxy8NQ^ zrrE!2r`O7lkcjLsH!-0Fl*cbJO~}Suk4=XLY^3*p8p*KgAjGUYRkbTGH@Xr_MrEb> zZ*QfZ-G)oV__5(yLq3DK)7y+`LflUzn$|{`fttv$N~;ZZH#58$?SU(i`BEDCc6bv? z9!`*mW)mTvoX@TV-t;zOnvj+s($IrpP3Vog6WFIo;o7pS@ZN{NWfi6g$x!=G)7h1C zP0{wL5^;J;xc=P?w=5-GJWADjXIlPOplRHesSK;EJ_d2?qwGh>iWTonBa|#LpVCZ| zh&JHC;Qc;%(v>h{8rC8|e`7kaBwbA5+|w9V`G80LIC#_4Ki)1xvxZ+yJi~2hfvg5AAMQ*ScHKUXiZsxsE>VF`Qu)zH6}`AuD&cp%2DgrcK`TmI!*$qP3iC zSNs=yN%uTtd1om{y&K=9=gRkHScO|0><9VnbGpzTr!%v&ecDKbcGRMM+W;fI$l@-o zkLhSB+I>wf);n)2hE=$&#eRg0d)$W3s#AEw-g}6b2F$%)VTM(>&w%|1$vU+g zJ=LrkYYHo>FmZ9TMH~C4UHMW@?s337YqHm)2llsRrTw!otit^r><6>@lLKhqO&!@L zkFOLHKHZ^S!P>R`SMP>dkyD7bN0yeT#M> zO`MWAUhXpz(!5_I`rp$5Z2P8T6svHL75hOB%gTW?Fkmoy_H~m)bSw|OSLpBd4R+}* z6ZfXg>A80!*s+=ODOTaWI`)J01~Z1y{>4VIGY9)i#KBw^trv_9*DP`E=~sTZ8msV_6Z;YJ zHDWq7)fvym6j~aCiM`e^EyquB%7NALh?S6;WB~0{d^{VvJiQgG@Ms(RK}-F0Cat-C zG<%Y{l09@>m@r6OBjEye~(xt|bRru?j~Dupc3By3VD6qldDUenApZ zFeFUd1@V#*zq`g6`e&F(tI|QN%DK%}titgU><7K@KZ5Cqhke;Y(-Dd2Ju*zY_6qvf zkL73!WMDrIq*XfxuxSl0TCobpdaxfMH^wcbIX$~DzlaACk)cbN7ID|EbS~%`DO%EO z4)q(+o~=Fb)rwU(;)VU7Jn}E0wtyC_{LG9hCMwqt(|Vq>D>r+%M!W_s45ri1HDs&r zx~W)&qjlI1X5zLlr`m1G+AS&|5t*t$h~9g-@1bdB#DB&gER=)WasMp!`VxdB5Z;=q+qtq!~w<@fup z5&A5xH_>g?%FwfKhpAYF=O(ZpyboZ*R@ysV4?oL;krFWrJQ7dalwS8-XBv*p+Da{b z+xQ*-bEJw@cvc4c!TR%}n`pwM3fA%Q!z3c;cBuApsZFU>%1xTnfe1^n9rWXv;@0Uu z4O6iS&qrZDSbu(L6m(HTU z*{HgDMiGfzq9c{6;rh52faTTlZEHd_kEboewX~D`Z)h1q9 zCE{6Um=nGetMn+~;WCSSX7?Jp<5PWgV!fOyR^b_N><6(W&*60ViLUA|2~Vwt7x&^XLB!T1C4ZZL7ZC_s)t{I1d2(K?dEFKJ-Yf{_3@y(Gn3mKTKN&`3ybI z=XJ>gIQSx*77Op8&K_X1VinF|zmLH?$>vSas zt8o4e_9NuX-MX~nl*ww*ai8mABJ@+3rhrHOV+CEZcm6D~khae=PW|mg&0|=FvyiYK zWC-=EMN6)ms5a@BiDKej9*forzBttnqRyCxte3=Ky2dwkRi$NIo zaj{CJ(M4S{=!&11Mt5K8qaHkPf?^fU{=0p$BEdhh9y16eQc zNcvO9mg>3;*%(&g{7vi!-@FegOJfSwQ+J*BmWV_cI~VyBt2|#_%q9D?^rk_y_Y!|~ z|6hd}R^cpG><8nII^}4vwW^xczq&-c+iB4*XSFH$AqIeH$i=zXmv;T5x_a+(1%_2P ze^(~bUC&Fev?;8PsM<&(3c|dR9iD>+%6duJzl0S1Jcw4wUPR3?%Aa8s&RmxKNZFo6 z={xsN)`ni)B%+jf1mMsM%PunOmFV?T&xWG_XFO^LGZ z`8Y@-CO@@kpQhQA2EDzdjBm(#xzdLECd63#KJL%33TLZhKgdrkUXcbyjkR8m93v59 z{jrPI zOT6wH9ZXnXkDiMB7L(9_BEu>ib;N$~M(eA7bW_Xs(YD~p64CpEMUU3ry5kz2;h)L3NER*iz}g!x`(Ov4+LXN;iZmt3Ip5B6eMh2xhpact2dTKwfV8tdOyBA$Ccy}M zMqe}g-`@PpR=;{8 z5iQuZ1TC?Ket{@Xhdfq^xOp{9`vPw* z`|`1{8Pl-lr|A+p{Nyj}Lf@?vt8n~MCMwt5KyO~_&sz0fA`v-{hG{_=;uLGn!e&ep z()(&CrEDnMTW2K2DjdI*3EzEN=(iF>*^GV-B%=MQFfC7(IHgvxLS{_Edu#8nq$4_v zWNEVIqF9Bakuve`kR5bF?h&k8VY>+v`KN?wQ^BJ>WcFhkqP2t9(=3UjSg&(6O<0Aa zkuvdZ* z8-lFJYsNHuyXHj{E#0RlyIgmx6{~RkQYP5h({w<(&a6%LD2Z71I8-|bS$by^Jj|Ge zwc(47)6n?#Z1Rc=R;?P10=dh{#_;wQTSOhM@uOW=z9Mq#n2E-oP(3V41&)RXBbr6D8c=(4Dq}^i1Ve z60x>bsMZs{h%qG2&5UV67EgRaw~X6Kr*CSfVik^G%0!klZ|Q$S>d?GRx=BQw5~>}B zm}RFxH#4RoTjcCZ`s`CBTD5Wy6{~RkQYL&G{zF^N>*rV6zn4V(3Ld>7X8CBEn;Fya zHpH_3(AB}6{M?)LQn3ohFJ? zR^j-iOguPojTY>eR^2&^NyN*!q1vp<@b2iExy_h{cdO5SMI-)tXD#^Bq+%70U&_SS z0d_jnzl_?dehG>Awm(#>2{Fr$UGkVQ4Vi!spVDZ1QMJFHw~AFbekl`bqm%SlP(3xq zltm)^;zBjk->^O^n}-?Ggse$-i@qCOTdmEqt5}8Omoo9XQZ!AIwUxR(|8pxQhC`be z04sPdo%Jwd8rFZ*Po$-64b<&>{;^%Z>+RKZua&}!_ zGp6A!Y3(mjd!x2${9KzAt8n~MCdNhXq}QYSse#&3iCA7dOsjk*R>?U%pBdB8Pb`~2 zTOI7Co|wMIid8s%DHGnYo9M(bL)9C$1`-ipFHGxag?EJw%x}gtAwg+u^pCi{Y87)2 zD^}t7rA+MXvYIZMJxc91{ZtGlLIYrR4a7yib}3-SG-Oj*PtYc#2dRr9zr7# zMm_g)ya^NO)`w|kSlhS1ejzia;q6IPqiDG_!_=YW7MZXLMaaE z6IPfLZh8z>%ho7t#x#tb)Bi??{54puIj{`HDjbcJi4%X%p--%X)dioINrcbMFwGxg z;jB;*Gp6ASc^UW8--h>BJpyJ?tith2nW#Q%ChhmOkJ>N8?-Eh;BdlG5cw)i#Ma-Cn z^-+~}&_yQ#)Z;z&QLMu8OPOfCc{<&$bWv|-e=ZST?iOt?yeG4}R@97Xc%NmLEi|NR zCpF`->lCYS{8A>0cbiNzW^AQqzn+<4A~&pK`32UZx1Z)|#xx-nGj5=}{%fJmd`ciA zH%Wz~kup(o#{^n*p;>L$v7kiUg0-&}SPhuFY%w#YA-iqgYFc8tS#5dConaM@U&_R% zspDwN3N=+zwsI0N5wg{vrnf2mv|?sV!`D@Ah0`k^YO43Lcr&cR@k^OFGI1>JTc)(S z_C;-p_^Yo)%Lc0fS2rzg#x$&5@(-owx0O+Qhg4-)h2xhpktd=TO*rkYeoNO>B7A0A zv|;f6Q^Nl6 zGGm&MpO!AB3Dcij3+?I1unNa7Wnx3vV7lPOF01?YffC`l71s04wkcPdd7Ci}v*A&} zblBQ`)>1WpVOWLZmogFNGm>_h*4J93)F_FFhSmLbVQt@uP;WD)p*-Htre}i(TQe3M z!LSO)FJm#ik#EwgB$^- z;=wY3qmh_~w+LF+&=YQ*OhMH~vk{PO7N5qhWSQ-4#sv0;+}hZUv~8_|bjQZw5|MR? zMZ4tccl%zwbQefIt9 zWyUl_QnRh1&;ALbzf>5+unNa7WnyXR9rR+@A=>?DPl-6+4A#mFgxKp;FEgegd*{?j z>bCWF8uf2ahE+IzDHFSL?4=D~KBMp7w2_GPRV`Y%1+ZQ%uDBV~P#%+4(FPU1&kQ-Hc3mve`jSW2P&#(%|FJ(fl zv5zK}&d->;uSA^5ZqXL)u`6!ZikUGD_uwyEX|aQztoku{k1$f<_@zv&^gT$kO)1GL zEvzUJ89sz*(N_3IRik2NOhe9gwjFeP_lhj5M;V4yIDRP;`L`XWz2J@0F zE#a(PnYh{0jA>W_+HNE^y!tqO)xR+6-4VyM$^GkoFm{7KcY2}~TmEg)n&6tKcuf2z8 zt9z|k+`gw2t8n~MChA-`LFu!$Y+uPgBw|QVm=*~u4mSi8F=HCufO+mHJ#wcrOKkN! z#VQ=Xl!^MyY&6@=E{rwaEfHV)Lz#cDE7Rr`He;HQ__N1p*1rN^Jx&Yn%r6=f7a=$5BjgB2kOF2* z6ViInZMvWQ!u;>djKL}#zm$o6PoC3~$9u7(GtNrH%ji&T4CFvgFP-0vY3TbTKBk*0 z_G0gUE@Z_j9KV!_!{jY3{irKD8^a_b%j!_g_YvgvbXkMn1*bs7K9D!+kmwwWV2!wjz-Ev=Vlq%o{M$ai%iKGANrdurx%M3LEaz0rZN@ZY zG;Ynwo(%p<{c4s|u?oj8WrD0Jzy{ntNV|NkEfFmemTS)-&yrZ&&6tLnYP$!U{CF45 zt=3hs3db*H;zRMmEKNxtI&y9Ui5Pc$xwZmgmI+PW&6tL@$nY%-^-&dS-`GgSDjdI* ziB3%lvomD|_;vlgsYFx;k7*FI?9jyBjA=p^)-B97{Myy8VO&!ct8n~MCfr^XU0*Zvd>?QlC*kTI?Dz?~SUAx7W z8H{Ut?e42G=jc(?89T0G=e4`r-}-)^*YkST`u+cTb6(WUoX^>NZS8&GAf2XYf62w& zLPcOte6T+Hdr2nR)wURwac0e|AZJN6_CEE>!>BFZ`q%v8I!)33l8b816lmZq^mUUT zXjIheh|djhO5V)N&XQ{U40pRYln;y2_aAz!(G+bXxfnhClki#HNPjUdmx;#snwaw# zX9z8DkyPV4vhKxTR~xB&Cm9+|(f*PP|5`6Z!C!6ktWgV?D80;L^uCULVkcKgwW9Pp zTnK^|G|_E07Hc#``%5lbc-$9@U#IC`>NRGfl5R0R<66#HQErlIMXBtpKw@?qy?4V- z8cosul8cw|`Ql{z9(svQcdS(S+_xB+Cr_$xo!uqXxPLJ3i&&?2)Nd3oqR|v>Be@v+ z!X+5J0q8h2}N>@BF9du&%WdPIq67o)qRJzV%+pD`qiG5tTaX2NG`TkIWAr$ z^wqbgEHzPax^j-O4|_P{frq3Tr@aL}6KS~4`Af|vCYqvcBo{k6YvRT3-umahp@NEW zjdF}p_`jc+%KvT58Pa%5i6Ynmv<$#qzbXEbYV5)j_lqU% zz4Z0xY64Bs{*sHe!z|)kkc0kud?O|Tu;0C02j_<2I!mgt#p$zOj9F4l&$v(rXo~ii zTyz|kBR*HVs?|K+o(V6U>Uh4VO)X#qNU9ZO>!a-=#`T)^V=|r>M^d!E zLhI|^lZgB!@t{%TDT6`de)}e=LSlu zaZT!wRicc3&3dyJo`^tFw7=wH^RN}7@Tm*Axz&a+@t;=yKb_@^>_AC1p5WrOQiN~3 zkz2d$kpHe+{@)bs5V`pFd4=dYrirOGuHd0xm$s2qD@x)Dt4NEfV>&ddA80jk_v&x_ z%fQx=3i_24Wk*v({P9-_@k;h#!m%1o+4QliUxK(+l;PcS#qOF;A}g>j&=l=2>GkkC zpOh#1obD~UU+Kn#87G)M6?nedwE#)AqQp4l3ZJx*!uf1>pefp4a8P~nHc^$$M}Y` zEXwEkOR8~BYF$n2Tm7$S?TUh=Xn)B?p@wHg)|4N@F|95W$8c{($~?Pj@8mD3#&zMl zPl&B?MId{a1e&7#B^Qs|To6US6o-)0@k~s&GygDNW#rwkKA60>-Xn)B?+sFCh z^vpnT=uwf0sKq(PZ>wERy5K9RR+Q>@E(m>YRmkt*12jeZOD>{@-V)(%;o#lPg^8ds zxUTP%UG)z0l~m)}sJU0fxY9B3J)sQH6m289*uLSu7@^mKH@Ay2v9VK*G3AO~y)fEG zQjPb{eXaPo6XJ3)kHJxMNp6b#F;EK7(v~U+hb7 z2np}=1x?ZZk_)xeYw@FYBUqSrf{7`fIYtO}udP0NNvd%@Lz}0fj7s<=zg6zwm$ z=E}6Noibv@dL%WX?p&qzNs&Q9*#S+kevBny=GS@`nXA|amRXOSty#83=7AU(`btJmt1sj z;DRS-H-xVtkxX3nwitf626AJ%tE3utnKpHXoTU0NHa|_HDcWCh@x7iWeD_a;jf2NC zQR%1IsCO8rA?|UJR4dB&R1auaSwKJmi$+tlzvRLiil5i7;FBeJ3ZEKGSH5_Lp4ja;y%`8~hX-tVMMy5=Wa2mrizds;85r8t>IARD(@dK8eV+rFEL3 z{UsM^`Oy%uX1kbF&5MbFoy>+6=i*$SRzXsYd))EV?8E~b#fZ}WI!)33l8fqbaqvb) z3736UnDA+4Htyow+Di!)B-J?2cw5&TLaBPpTlP z#-G)QIGAY((ynv~(P@hImt2@TL_(^|HtkrB9}^cxnGHQ1??0TJB-J2SkUa37E!Yl6Vuk3jR7$>^}=%}NwuOp`&a{Ne0{AohT=L+(f*Q) z8uR^Oecu4xKKh|Xh1X59Q3~&Ce-v?%RO1@q!J)7#-%ZbPxTDb&Z6moTnCS@}=f~)8 zs%>Y&_T6lBQt%X%tuB&ke16`)BIKV8(;p}A(rAkIms~_|c7}-Wsva|b1``|cHSsO( zKR?pdRZ@++$qV~Ij1i~5syIiZDcWCh(f?8znCsb8Z}YcgqG_VVP_QpqQqfIPjeooS zJmJZ{I{LSY%`}>#{UsOfFC9Vt+gcyE`=*tOM!07C@XeFzxHoQ+YDIZ@)dgDjZLH^| z{IJp#Z6mqpnNS$Y`?c4nzB`ahh3hPfk%Cj~w;XksRO55C`0~*FMsq#0e-$fD(KeEc zlnFn@)AJqmCl@A~sHnNiVm!b#sUMbjNUHHPsN7O8<7q2>utTVcrf3_<)0Sg zAfDjzCCN)tjr)qq7lB(ot@Pt}S_zt>{UsOOPu~;bLmOQ*T+PG>zZ}DM?WB6r#amL1 zpA*X#fUSd)^)YGLf~IJH$;B}9b#bR|vL5VjXQCL+XK0M;kelE1mQ*Xs^Tpr9vC9qh zI^zxsnxg$B7u6q+STz zm^g_0qnZ`6sdw)9N~&?~d4b2Go>E=+98wl&iuRXW%-eZF^oj}AzgG%k0&x0w8+_fZ z-``JCjnC*8+!GfQgY*L%eSoHDf60YonLN?{p@%-IUkxT|+H;IBKbyMzrJtl4KbOqD zDdyes&@BV20!`8Wl8e>%4B?(oT3?-DVqyn&01I(1Ks)RJsKztHobgWhcWHh1sc4`n z+Fx?9$M=A^>+w~)wWJXfvA=SRXU%M?H=b%mHBObkdqu>ie%4a=*8!TM{UsNl&iyUY zBaUei8&a64?y}IBHqfS){wqLIjnns{&x!iW^R$Ptt$?Ozf5}D1sRu;$8}qbs?b4Ze z6|~SeH_xX2EEFiIR+JXiZDQVqZ0*7LG@vQkUve?{@&?U{T&uQZ2cBSG zJ5W-M6UN6J6XVa<(FVu%1e&7#B^RrP<%-%Ttk(KhGnmMUUT73LZ&Md_43t#kx^U%) zXkpE>=3eXzG)4PMF4jcr!t~af8`!fS6C&n+I?EPaaBnziKNaQpNnI=)b|QCgQa_+6 z+97f=<1bxA%Q(|*4=!jMNj2{O$h#@hj)t2i@9zP3a7EkRA2wBY$LXD8OnkwHZJRsxKJNmU#%EqXZ-}sMg@u;a4QPt?m-Kqrq&hzoMaCtISrKVW zRJxyIxX0Mlh^+yVYTQ@kaZ`+%pC*EmIs;A7{*nt9rzgS|k}aZ?c1(;ugPjb{%*?7A zAgRWwz|C$6kD1HG+jH%Jrf7f3MGy6*@cXHWUdNj-v3Cc~pc`UWbNBd5s&NM0u{$Dr z;aQPrYXU4q`b#cC_P-P{qwb4S{p&C>a(RwXW1?NX)DEvfH0~wKeHsb$YcS!CbBgM%u&a$m_(`hqVtQ_l4?acx%`8uV)6vr{s5pU+Fx=ps?RTRpq39jdF#o! z_1Xcl+Sh{4A8s?T9_OkR!+GHsJ9iI!1pt!1WnQYk_+>vlCbDFz@3@7 zOmyC1F^=JSxcF6Gl4|@}*-OCH9(Cc}`t^dQXn)B?wf5!U=D0d=DRB`Ku37kf;M&?& zcReN5it^9+vaqgf0~lW%X9f{2~nLux3CKc$IsSKvT58NZZaFSaB}_cg|3on ze2(K^9ey6E0SlkTYcxgsOD@vpM?=oH5cuej%0%HTvoY&0yZY?6i=C&-a{R^ZrFEL3{UsN9om;@iX2IGfYY8R_U*h9n;eB^~dFPEx zOrB;o_IY8S_`yX|ji-j*me4A*tX^#88jYrCf62xDB9So6qnduAYdKg<>A&L5w3;V59+<$8}Mt(f0_I&LosaBNU2@$aFZj7Ek=&Y5d zXdB5zN=ZLhk(Z=9#I(<);x9Lg(ex#rK)eN?-I0zI*Nc7#fhm23K5*;(T$-Y7Bp1KW z;!3U0jr0darkJSs&pW^sT$4IsfQO`7QC1$Q1hw`{{Y`G7iKb{9$wjBz6`;ZHCi?R} z6$BMZFN@)W`)g-Mc}l7kW&1)usCT`NUZ=wk6HU=Jl8dtfKZCk7(d~QF1r=lGT8u!v z#>nrUl4|VqS9rqN({=O?0~-mNqWvWoN8KHvX;edfgtZuG$tC~uo%x@oK*Xd@|INNSrDVjgSJfQe;3*z zXo~iiTnrthz`abNH@|(4i8a6Qvk&e?K3~m8QjJp`>z0O+FJtws+b#;4qWvWoY4^U0 zBh{nzl#~KM#ZjESGwJ6^)$fXrq#EZG4Jr;Lk5<>elzA^`inftlOnU!b^w<%qho+PT zDtd|>BhA64ULE8ssm7CN?iPh^y{qU`vmAh?Xn)DYuV1gk)&>Fk;2Yjd^u&4L6P<8< zyW%IQ#$I$yAsFcAr~is|0h*%yB^NWUJ`)2HT=mBHykQ?$S2!qWGKIP7*; z3r}gt#9ckdSk>O9dKL(fR4Ymu`BAty+}1L?s6bP+zvLn*?7ArYZo76Rz6}$T^KsVw zNSs+SIzUp5Yn?4G#U9t4+WKS3KvT58l3L~l;4|fi-Jvd<>n0S0W?KBL@qYXxGhfqtYmU+ z!3Aw2sm6}%%Qq3z#KYA1WhZdA;zWFWl0Pv&KvF@kjqjYxeu*B(ubEu?bzs70FYbeM zva4ny{|vQ?CP=M0g`Im z!|U>0+@D=Xmnxg$B7hU%hgk~qli=ks$Fp;nT*S9yctKB>UB-Qww^VkouW64Z$ zzeh`;DcWChaVfS4lEPc~}3D3+NV`z7rnYqMYQjHU0@BS7e!}p0TRT=_K(f*Q) zkQ+tdXyFs0WRzrL3qDr^>_t1)_m@=To*#U|+imS7(HQR}X^QrjT=cONgJ#Qah>>mL znaF99V;mii_k+*;B-OYMpkPrbUFWF?X%P!FMf*!GrYvxTFY$QK*)5WZ!%;cL>DhQ* zD!zYEjr$-y9pJ*OUt-JjaG)vLUve?*W(lYmhx-THhA`oWU7ybqyIRoEPg0HVgENXl zg>{Z_YH}r@DcWChv3yKv*i)t?gyH92Dh}f_;el)MEV?Pal4@+|yOx5a{uN+fQx7}= z_5V_|zvSZOta5OtzBBmDbmHQc#TbQaQvE*pNUHJts2ydY&15e~u$6){Bt_duE`EP< zf+o5*B;P5<#H2$OA6Z-jZtE=QY_4%FeC|4L08wG)4PMF1(6*!;Udkp-kizCPody&(zrO4l3&{ zsaBNw&fd`GTLd=FM+HsM{*sI8yZm8CTm)Rn-p9noh8AO39-h6N?j@TkWJsNZM*)qD7#^7=qXMwHxn0Nc)MWHMa|fqkE!3=8qRNMf*!G zev}S{8RKd~{Y5>Q_=0P3O5@M!auH8SHU57*3Wald(eNU`Bxs8Emt16RtPVquMMBwQ z0Zh35V>TM#@BC4!hol-mU#+SEm2TFAtMZ+Rrf3_UL?nE)sprqOOcPPHsDz1`h+$X#z8JaD2gf%-mXf#FpOD=ZW+e7g#w}e)HHWSXb zvyHr_c6D!}i=-O+-Jz-A;C4-XZTY80Q?$S2;%BjRm_B2PI1sR#iE3K5F}5PEL)M)o z)%dynQy1`d$q{`$b2XZx{UsM}qk2M*hJNDg&{Iqt*_v(a|7=s6j&YV$!Q{^EnA~0+Fx?9bx>32dcKst@J>r6#?>(!531sQ?F&~) zH9n(vZw)`z7S<02HqdB__Lp2dUsey==lSRpBVSsnXxsxkWN%!T@rRqF8b6C}Yz)oU zx#(Xje74dQ?Jv3LS*13tT2xuznw!EzSA0$MEpJoXxVTHI@opj^3GV*#)f>MbVWlbB zMsi`AQwuh?j?kAjY?DAm>m6oe8uld<@yr*h6=lxOL~u_J)+Y@0h^HyqMsl&@cMTYQ zAxeMMe!Yo`6<5th%K|pFXb%rbHO}lWlK^WjhT`u2EE7%9Hj;~lV?&|6Pc8jywx^)N z`rB+Q`*Bho?cyn^#+d`-qM>p)e&^pE1x?X5l8ddaf*`{SSF!d>XTrU*#mM-E=Pu!% zYN~M-Yl-UcXhwBCWp7hKQ?!lb;(Mka#QuoY7lDO|z+_wliPsqZhnJ)p=k?jDLXFoE z`sMT)f~IJH$;CwJvdzw2kB+QFRSzLIL3A++8df-3sx5?4ad6m289uskgeuNS)Oy~esQ(F5lcUGuc5hQ(J> zja|l9XPDpBMPK`(G|&|7FS&@0aDdvs%IKL60ZbhB&M^uG<29W8B-OYcZcBM^zg9}` zu>|j{*nu; zQ(;(D=(9F3DvF5)O>>O(fHP8Xoh8+{5Asb(kdr=XA1z@(Q?$S2V)3Mc;P&mF_TJIN z#A56KcHw(e0qg*%#yQ(dii7xlU%PuJ8fc34ms~t(_CxrN$%GOm-secRn{ z`%9{E&7FfIG#h+WTl=s!&=l=2x#;cxO)S{7MB6&2ITPv2a*T*cHuYfR07WrD*i}L*ACTg$3)&X?0uHo)NYFdB-QvHm01wp4DY24%4`KR zMf*!G=1lx594k9(D|&Ze;=lo1_xd+JueAk8sug8mYX!#s<$(t{qykOR{*sHEExw7o z2(z{FtWHc6!47%fMVtEhE`A@RBgGS^=KU0DiGNxr%LyUG?nmc)AC!i_XA#%}V#1D~qwX7*>8W*&Uq#D<^W4n^{ zypYMozYXlhzrH&7so0DsW>Z10jVCYuSqchwKVTYLpcNB`@w^GWG|svo$TdDc|6Brk z|2SdFy59kbvJ+!3E^R%PPv2Nt8_R6Mh|f}f-s*8$9Phk@N+iefK=fTma* zNm^BG)pER`u=88-LmaiMh`BcZK~`uNz*HYV4LGt3%>GZ>Tcnu%Id0UvlAo zrX~!sctM9L`bR zPZ*`S37Vp9Bp1I2HG=uiU7_`|f=s+?XEqKmva2=Tx=X6@vrpY7(9y{ieje0KG)3D; zF5b0j4mV=T!=Jeen0Ov-HrCCts|PdOCDk~i@mCAjxuh(#bO|!i6zwm$xaZmy23m_l z*^Hb7D!#jzjZ?TzU%YjbRO6Xp^V-4K(GKupV#QpVqWvWozkZ~FZQLg@D66HFisQGk zja&Ha&fCRJQjLGR$I`%j7SCi^w%tlow7=wH_|)F;yLX;YUzF0QxVd&96TM?_Xeutrm~zvQC)t${GBN|rdfr#TZ(=i@cJ@mw?%`5 z;OQ-Fm@yyAwhg>Apc=p-DVbE_>P<)S+X&Oz@{*sG4*Gvc~RzjOP zZXy%E=4BfX*4WfJxOR|gJdb5(CX9MiNIQ@{PNON>UvhECX&@}zIzwA@sxuRvw_{H| z#-@(x;VP+ClzCeQLE_a3TI#2^8cosul8c7^y`b~?6I%MnKqijf$ToW5`jR1~-6Yl6 z0aWe_bHyR;L590VQ?$S2;(KmKsGaviyZwE+m5QlOW+PtM)MJm`B-Oaqc~MvRx#+pp zeD-WBP0==zi@^1*A*yI8edoHQcq%4EnT<=;ZE9jqJdcHRq&Nj?aw=@^P(*+KN7+L( zMf*!Geza=_(|bDW8w&L|QE>ua6B}dCFzJoEq#C=7a;;%$i&DBfPPC#a+D3Bm@7?^x!1I|dH8rR|sZ3d}xE9kenT{Y1ZZ6mqJ>?xstXFvV@y+}bt z|G&(}U^knpxqC{g6(#p#1GxXrRd-ugNzfE+Be^*DD<0(YkYp=C8@^u+QB&0D8obdyR}Ks6zwm$ z@Hi3zulM`t)3PoxF&o#qHgdM9jb?gFs`0#{AvK}pTUWi_t>c2GXn)DY*&CH0^ryT2 zuKsH#PUAcPt2@s4_4AQbCQ;~_}M;7BRJoDv(x1Xe1QA+jlgGcK=Xu->Hr3FdR{*ntf zz;z$n9%Z> zmr;|6@h-S8H5s2l;yg>Lah_$q2ec`2S)1<{1~f(cOD;z5D+k+(8CtbdaZGH%4xmj3 zn;L~30M+<mv$8bdZ}cebibq%_8JUx(V%uwDL=YCPFm zcY(C^>$SllCZH+WUvhD%Yf0$bezLYMrx6pCy5|_hXX7mI3IUR8+=ErK0<`ZlMe~?Z z4`_<^mt0)6mVndYQhWOnSIdyEJ78Fj;e}^()#(n)W}P zuCxZ4q8%a^XV#R2GnYRl>^sHX;PqF~PTgsk+& z@C=*(K_6^t1HcxT^q2J7xFTM9LU6<)Q~3IZO!z0|808%8>g_4=LSGiw7=v+ z`{fPKx7HLB8`ohXu2PPnM%q=^E&h_~|EzoUgm&}miNzJ_0!`8Wl8egWeo(bZUvcTO zVB)hwj>6xTrR z2!Nvd)`@+wkw8MlkU=o@-gY7oNl0&rec~GnbE51ZcQV^cYYL zXo~iiTwK7Xuc3nuh@6cfOq9d(qRhdqBOkkjuu6Z4;&4YzE&x-!XIQjO0h)|=pbtHO}K=!T#v+Fx?2)PiCovam|Xt`5MOrP0{|6i_pZn&;utyMcmD0;v)8mq4=}9 zW%80#D@xv(Bxw1(D0Hs2MbH%OFS%$kzad-*EdnW1{$gSS-g9Q+@BH>5Pf0btwg)zW zQe}$5Z5OkkDcWChQNSS?jvXol9V*OXVtT6C_&Ck3el~eZs`0tnf)=oCZz1sV93g0m z_Lp2VUDz6`{jI>Lu05H!6pOPBaqao+JP%1VJ}dg(7F6T6fYb(prf7f3#TC!?5S8>r zjBt!);*OiycrqO4C${vERO5LpDIMWQ&_}WKu&1CY+D3BGWqxO9{^q%O_OBxozrST0 zbNkuVr%&A_)r#_UYFB_GkHxqi_e?ZJ+ej`(tm_2{&KJdn;6IsIpND&qaSqF;YVMM1 zoVPT+H^lTfFA94J6HU=Jl8XU52f=S+gBX`zI-ZL6e`XuYqwx&4rEZdHMOjjNFr>w; z6)$~O~jAIWO>ql4?ci>E0K#W+%0w zt%jOtinftl9Dk4oX?5RdtsTEHG1nE>i`KWPRhoH7s_`7Go#_yha$j3<{-uegXdB7J z0f$tm=Kf1_Z5Ar1*nqEzjd4xUmt!81YDH;3yA!k;{90?UBv8;4?Jv2w^t&b0X;WCA z_NgNi%i7~iju@MIH_=m4ttfpHQ=rexuUgii7J{Z|8_7lYH%*|~gJSybDbtxKINoeP z4V&8Pn5U!~@1x$dgoZJSex&XMK~uE9Uf|Q9m5Jnu&HeCv|?9O`XxuOH!>U zEf+S0A&~|3s4a^HP0{|6i(PdjxaT?QBTpP+!VP=T{7{=Z{i2toT2Wf}X#o9}71VoQ z+bL*@_Lp2tI-3C9k{tBFBbS-@&yImo)of~9s<)&X_icBt1N)a1&|TKp1WnQYl8Z<7 z82H(!h@LR>1ryuwnXo(Vubp|vTT+c(-!6cDS--Tmz3&Q|qWvWoi>gQB$yo*TwbKd! z75!^jjNAA-AJ^GOQmrT@YsJH$MV~b-{*$07+D3BmtxP!FO#7_$$5lL3%xI7E!ejAl zjvGFbYTQ5Q76X5-eWkfKF9I}0+ej`J4yg)jK0nh&WjZsl=nq_HiO)Z_HuaTM<7b8j zkucTwp|imh+BD9yRe}W6HE43j0BvY=OfPpzvRM0dcpO`S=#w}f{B~1ImVd@HucbGe@V5XOdAmhhwo-- z5uIXzrf7f3Mamfu$XTDN?eABIi82v*z5(vr9&piLQjPO0r5_Cc-a*Uw2Y{w%8_C5J zoRvPSl%JL`vpy4_@hq}>TX5D(Y205+x=h^1a>X0s?G?4)#&vqfHO^=(;{|hS->`Nn-vDTe_Lp3&vAKg!pJvu+(3lB(GM-WO zk4?RYvkj@n_w(x>V1C=)`Z2u`&=l=2xj5O*18T)K%WV?fn2Ev7|EII8Q9nRZttf;4 z@Bn3Ar`&R$je(|Uhsed(!5-jawJ7nj-wW;48 z`%5b5wQ*8md}Z*6?`LY=tu_;ro$z;F$gUPT&ow@y?+^^h>O_;9Ln6==?Jw!|@PzK_ zRbbMqmSc z38xR(^#$A2xjp?Q)p$l#u__QU#Y;Gt5`d;?f5}CMj-e2|E=DA*jA6q48lIzA3(qnw z>o2Lsy#Uq_Sbn&%D0Mgn*SY^+iuRXWeCk;Z;$E~D4}5Ae;c?Pp?2~qN5}xTzwW6f0 zsRo&)`ip-D*8rNL{UsM0Y+=x9`VcYvMg$WF@cm;+BRqp=iJznzpGTR(VSATJ;>4CP zpefp4a#6M)p1resipX=Q#>C_0c%}v3*WPc5vqeZpigVBXs>9-~bH$EEAwW~KzvQAq zat#=lHD8q3P??F9Q*pje2fTMK>?f(ld6tbMAwTa=v9Mt!pefd0l2%nwhE1;tzDdi( z6iXlzg)=NhPh9sJz0Frrtte3!qoDQ3^`fZR7ifz1mt1Ts5(C9&ZV+{!c{5R~nZ>a8 zwyQOheI?b3vVTP^WcS-82Gwx~nxbta7iC`5f)}B?MdS!qCgw+23|CxRd+WK6q*_rr zUx^1}Xs-BHqdd?Q?Jv0qa5cfdr*g&NVP%;}$38J=2(C|@=p(7ddxK^Gb))jcn5D&m zrf7f3#e~0VL&eZMvG|#+6LF+Q8XIQjPafl~t%V_OzJWu^`YC?Jv1lH>VEl zc04Vj`YBAb#4~bBV7F9mowsCKSu2xZ!QBhu{_yvLrf7f3#R;uGG<$bmPFDE{y(Bv>ODbIw7=w{P^~5~_S7Y@?*mRbCSTW>VK#2#9^S(z zyd>2)>%LktxDC4^T<)9|G)4PME*{`Y_@ow>#k5d66AydgnZ@|rU{!lBNj1*vyVVL- zr~V@X+;Rm?(f*Q)s+-%u;~^KtW7qvm1U4`mYcue7{@znkjn}ZGz=_8fgyYbSf~IJH z$;GBw?ZLg^S+P+0i-~_i%trSfcn;QFPf4|+R7vgx7mJ-18_F*fG)4PMF2XW8L)5q9 zBDL0hChC+n8<#uT)zBKAl4?9_>vdOfxpY)4>^()$6zwm$xPa%x&lqSGzXp$GV#E7v zqj(!!PkqBfQjKTuWcGv!i3dd6b-e^l(f*Q){mvOMtLR2yuGy4{VaKwK^R?}&n&=^^ z#@!ry`@w%@T3QG%vu8_7j#xuM|eHC>zvEziWI71_pnd_Qk$cb8Nv%7|*25Vc~m z*chq^nxbta7hhl$;J>=4{qlr~ioB`W#_*Cj8+W9;q*_q|ua1I8GFFsXyVFEdw7=wH zYuH%m| z9hzEPL4c+?*nxbta7w>`o`B@anjhjZ+{`%5l%c1Q+?6F0PHLr*gCX%@}{XlPTLVV_7fKD(RH8hpy1)5e7y z7BofsOD-n0Xauzu-q5aClX&wr@oVpefp4a#1oW2A(WGpyge5W1?kCi&4Dof6nIcl~m);s*eet zJMGcBoh}bFMf*!GO7*J=j?=bj*>!!HXfyz44s^slqksEKs&Nf{%Q$$xdXtu%;SMxK z`%5lzpI3)#msV@foGLL`5 z-7Bt7JiF9SQmrVKqLH94%F_0Br~))a`%5mowui#C@X=aKl^RSG#SS15_Z!s14uEP! zIqF&+R_qr0{;~0pf#Em!$i}^7Nfyjo7zd>`YY0r;upefp4 zaJtK8<`vM2)lC4JqWvWooq~d)_qH`w z*9*0oxafvwROR70inshF)r!*WMP)cVcZ+o+F2kZJ+Fx?<&<7{VpZ2$UZA@h11g;A% zb`|#my!4k;<7c>M!BEMmnsxE3+CWpZzvN=(q+ocsJ0N%1{6r>t`TS33dHl7%q#C=v zCBZQFMp$mqF^ND^v_s?~-y94XC6*_w8pZ`}BdNv{b&f_tUi`=eB`zAgU*O8_S2#T< z%U@DKuZ=s_Gi$<(^;Jy1b#cud5rO|=C-W0$dEB_#!n1xw zh+Qpp9?#n*9VvD)|3*WZf=;5K3evXl~m(?PJBl6%XP5m-OdMSiuRXWxQp8G{o-KpwFykwk{+R9f_ zjpw*~NU(ezFZ#WA2b!Y&B^PaHNT^$Df~c6v#hMEE{(&8`q4-Lw@kzt3I8!*M-Es(}f()#mP_D`{3+^tc^aBYV2f2CxNkbj!55I255@*mt5q$NrIeB zb3{ESF2b&v4WAUd`lgwWq#D;V%xee^ud>CXkB&f7w7=w{cd%#A+xa> zuhIOYx1<{1Ywt9Hqwf}q8vhgmnxg$B7hgIx#ZP?;g|#9V)0dfzr|s-&;Xl14)%dxj zMRS-sc8R!G_`9Gf+D3A5?|E~0@M^Ju4qusQh3iW`V}I2^dP}MmCG2f07(eJwG3?n( zK~uE9sE?m6ul2qeo(PizRs=h>&*6#|MqWvWo{d=WA z>k*4ZpP9Frcv0VMWH-aPoQu6A)rykPvI9J9wMc9-UlKG$`%5kgHSGu+(sM-NTj!Z* z7;ZKaaUSxOMqZL?{68<=89IBKMFaD3K~uE9M{Q4sX;E`Tqelk>P0{|6i-4Ei;M)2u(Q@cMCaM%L8%GlC>KxruQjKd^s`dof zG*xVTxmC~4K(c8_C7d>6x(g zWJ&RFlQB%x+>mW#6|}3%cX~*w6=g-kVK5-Ps2KKRsGup@UvjZ?#|W5`zrYlaGi9lG zye!*z``o4uTHqn6#^;0IMnHQ1EK}OUbU{v6yw2H$IGZBKXi6=5`>M(pw zq*_sY&!t26J6YPhGlv9C(f*Q)(k>mL*Ow()<$h)p-9i@x}``_@ZRttdtNbbyNu%v$quR|HMb z{*sG<*IU7Fxl;RF_&F1vlW-&Opc%&twZMrf~IJH$%TOpr0cO2 z+Hc3NO!(lwi8np)Or*8AK9O{!isI(f8VYsE(bjKzBWQ~Dmt1_U+60b_U8aq0TnMNb zp_`44c#T2@eI(V2GHF_Ks9VsYHCg>r&=hSWx%jlE0nA>pSi6735vbU9%WRaxS$YdQ z`ber3idWXo~iiT>QwY1#N?qw0AYDFmVX)ojXsnsTFYlAl3Nn&ff&}V(V*LJSqWA z(f*Q)QLSUar*V`v@@Q2izAnQv!{*>#ee3|J#^+Is1h#;f$2eev)eJ$dow9zwE8G>RlCRiuRXW%z01~T%Uflo|%H34Eeef z&*T3Gu7Nxp<1eYkGuBVXz$W-^-QP1DXo~iiTs-o^vygi3wywpsMN}-igB`#@n|i#P zzoZ&JCx%4BfpLedM_bhZnxg$B7Y~m_!WOqa*68g~OjLb}Yn^R2HGYD>q#9qZ3PwSj zog=MtQfmTD(f*Q)sXHU#$l}MjzSX0dIQ!CKOwPBdCFlA}s&Q&vLQVL-;#+QyRZ&1w zw7=xy?3+mV`1$3bV$RV_q`$KKcb?_BdH#}WyjS}b39pv_KGe5ZG|&|75V?r^9trB~ zE(sZhxuD%5)%cuqG{C+Hw}giesz8>GEA#ME@xw~~k_vilJc;HJK)rRR62e<>5p@91 z|M-kOwG-DkopJ?0ZPVifxws0@6zwnR^>7DhhuYBlY>4TqxiS;gw^@uPxR&$I2R})* zq7-nb4G~YIY2Nk9KvT58GD%N$CiBE`xOSVQ zXn)DYo>dZ_?zNi!SyYjUIDFmh>StHo)BGgWc=lOc6+9Ul8b-))Psjp9Yh+wb5gN5%wmj*#B*h4`bw&Cmc@-E=yI~W7_!e3 zXo~iiTx>a%1ncLP7mM$6@en`zoWgyObsPCgs`2wx_Xd#F#7k82cL$oH{UsM|8#aJO zVP3+h$3+FjVl>1x!mEn;N~-aE&Wep-@~4WTeVhx>6zwm$h|@;f z8i(@$j`&EbvG*y~1YmQh*y~yWXo~iiTr9iM7?y4g6{TBok$u)|nB(p0t5H6ZYV7o# zo57fuHG~WHqBKSOOD^8tZ3^ScM2bZ}x%hjp*=UN_h^Xl!saBMf+Rfqe<`{9KQc0jG z+Fx=pret$?^&&>(_v4}|c9w4Vv)b~?TT+dE`;3Yxwt2yg0U?Fwhk3FS(e0t~E6M5ibJwaZzc2*>H@) z^NRX%d&lW({%Y_gg_z zw7=w{Fz)o;KeM_x+n0;8k!Is2t{u!i;w7oZH4_8V;M$a`qWPX@f~IJH$wkqB(%?{1 z6>)FbQzk+K%|_h-d{(r;OHz$zC>-np6?_83!|@LUP0{|6i(QZoh1R=@OEGttm|oOu zjK+Nvm2eg-)wtg0b2m8GqP)2OD__tQ?Jv2g+ovZiF7wg!E&L)AC2_4=&E5<(j9Y8u#P0=?h~9 zuQH7pkSA!0wvk*sw`M@*rkbWYla4Sk66Ys2dV(E59-hNXI#S#lUa%k3$qh0c?s{0z z6zwm$ST(aByvk3H8+k`#qBUNlHGbY*ihEzFR+JgD`oYXm&Emda*91+`{*sHIKQrLC zL%21q<6$O}@Mksaq)i=}?btt~^(F)^oz*(iy7+}q&1 z461ScZtq@jQNL^L9)3>H6zwm$nEWCgu8i=~Rxi21#1ntB5xE@CeVv1^C8Q%<ZVw z!RF&7wPCBS3!0++B^S$Uc7}3CLN)KK$4r#Q*OIhFc+aVONvaj4>aH$ueu0m6Kt2>S zMf*!GPFXs_5;a=$-SnD?Z*|Rvf3{8i178!V#(nhZX`n9%*4i(9E@+DOms}V>QeoK6 z1kLlG&rJMhh5B5)KaY;^mQ*W>Ly?ZKwojP$F#P?0r+EBtiuRXW?3e8zu3Dn@y@mqx z>n<9Ivx>89YSjVWl4@Ktu{aezeyO2l{P-qliuRXW1gvZg<8`TZ>`@q~c!_7lpTI6- z|4wg7HJ^Mf&&u?EAc$~Dfn9Q*;`VLcV2m| zVaAy#tzB{vpefo$a$#AJ40A(3>oUD06JZC;#*)c+My~LYRO3C)pq6m2d`)eVH$LGd zDcVMI;nkukL{*5>!V}6e(GJ&g4#R6~p5h~^R+LY%&0*kQ5t`4Dl0Z|mzvRLi))?GI zMr!YmRA8dTb37Xme^$Fs<2p;yk>Z|ezh>aEw5s+gvMkUP?Jv355!Dd>&8Vt*I=C{i zr;x>Pz~A|Ya=wykMHyYW$^T>Pti!6>p18l2P_a-EK><53Xi${BNB1@m#4fN4+lxr3 z*o`16qSrXb?zqOaW$&Zgf&-Y>4(#r3-#Pg5{APIH`xnpk`#EdZnzh!P zE(cUa{g<5ZniC9NnpM+;JI;)7uC!QRnV6~c$9x7#V@<%mp-}I%t5$lTBTyCfUveV# zOG{YQ!ATp3XZKOU-+QtCAvsg2un5;t#7By@U2P44W6EpYD>?&JQU4_;Hf+J2xHn5` zPfxfp;&h9}`s)Q~6LTudl*Y5Rlwjzzu!J@-xe`zn^P$M(r8QGx5UauR@$~Bu0U1Pf5{0YMS%@#-l%^^S7SsDuAO@>&s5^kFG^`a zD3;j*Znt}{PS{czsEYb8Iq}yP8GJThS2KQBXGA^p0W4dUsl4i4MW(bMOw^h~jig-F zYG75MD(b)F#FsA3U_)(_+P6Y2MpR$4Sbw@TQyH=upB3?u;@Wwc0!cNGsy!pC165IP zBqzN4H-);*($sFbwHcATak0K(f2JbmqECkSGV#2kIx^IAT&A8h)dZ@d-bhXyz6xMl zqq`dOsSYFjaL;Ihj`3QXsxqZ5XL>h-I#UL!m*><5s-pf&POO{Q$8~EePY+060ai zJ#t8O2dbhz!~(=>06%wY-095;>W!o{#&PL7xJpF*j;p2u!HI?Qk32g*~gRzZdJXZe%K(u^J*L+Qo%H z@TRLru5IQ7eVddPgw$>!(Cg`uBbCo%g+KCTxTfK?U&vIZ?nBQVX-^PbHiW>y-`&$2 z58?#kAnjpP|9dFBin39s#a3hlwRV)oyzt;qNRPKtZ}h9gEZmK7 zd{(=$(iEQh#tH9HZ6K_Jv+9`T%m`|=DUILm=}_=2S6)55ts=A3H!#{aVFzX>yulsP zq&>{Qe$ob>Jg%kM;>byVmySM^76fm{HgIimbv4MpA{%jHB=p>&rCyqWZIJc^VRM@> zm{`SEoifvj5p)!#G}c?1)dn&yd8;GwydSDMh+fV~n=%!9V`Z5W4R3_O(MF)U?XSQH zIvb!gp2_;U4J4ic_4PX^HUl{7x>)zZ%EL8BVUfje-m^TLA@{^txPtew z!HBz^NPB|tGq3|ZQirP>PL*W@o%K^1&r$Si4-Q4gs#j|`u$g{q%z$W(@8kXuH<=ST zLPvPM>@T(3x-yKQs~1WOg4wB^>xJLx05Pkks4@SRVJokQ6=`}H_K#^cZZanl4|M{2tH0FsRZ260t_>-T zexC~+AvJM|I-|2aTS1meO4Dm&KaaZVDsy7eqRueMJWTbtUy>1YjZ0}kSb4G&?4C7I zJ@K&=TM1XilYz#dy{fU(Rpvy?_%1Lhy}x>9X$eNq)jg&0op0<6CCy`1$DJjCsy2^G z)1A@oK2CI%IT0*&h1&rU>c{xvjG$f$N@G2;HC>=*#7MPss}ev}d-|v8w)--btRb#4 zC$5$31~&(`QP+mpF@kzqD2;WBV!MK)XMfe&p*T>LPxmyvCVHcehq}s~=;zcO;x75A zcQT7If_jZ8jWI918@N_&qiSBofU4HxiRnvmto`QdDsv(=bnT2`8v`n9`U-zdHhkZyyvCUc?5d>L@;|_AfDe2cH!u`T`Qwa)Lf>@vNSygv(>8?a+5jHy>KT`55|d}RXIVUq?E?m(H}ZMz4!5A>c%oG zmU>`ontl>9IevS($(&f{(h**rjuYMg;slNMQd$rml+FSDwY_58T6u37+hbYj%@4G5cUUXjo^k*#D&i zBWM-@rSW~-XbaD7^%C1P;F$yVxZCL{-p4@PQN@YYCELNP*1g49Ps+3G1ey&&X^heP zw8e~+j$%Zu3M^-$cCp2}hVP?+e`T2yO?tG2w%_@nlxhtY z>qoJFY+YJe=0vI(21)M&#dQlgL9=Wqji-6+YXj5k)ECEgcV@Xb(c)tL8TRwDCoy}6 zw1+cGtQI`te0}j&3r^5%Axh)78`K64Z*vi=6|2Z{iiY7@b~W0o2CuOqDQOR98J%$j zS;I{{{n(iijY)14r7>RnDHPUCw--la#X_ojjBE05Xm_Wf4}cT#NIaZ{XGj+yX!aJR z1)=S#Pv-L37F|jpwm+3Wb=k z>p_nPR$`fFmV3H_yK8FTE>liey$gZH5yygVzTgDSrlYhV{6J#P%MC#j-dAE7bbT>z zt?4)1y_{M_=ETZ%A#iv0oS^OfTo^&K0x6AWHSP|9L&HY~9q8o3G6CN%Sgg-{i&3)e zRb)=g9vuRYH&hF9+|CK=Poy;ZeWr&%mTnic0Z)siD(XYzMCU$u=XHXc^vU1^^>|Vm z>*;?i2Qw~Wu0d{FlNEmZX}E(UXSb(p`Mbi#OeOM(r(AWvQQs7Yl}TK@&}X@+Z&zs1 zf44flwjB)5G3b}SV=mt=Klw*}qh9QkSy{2jUp}u?u*3E*~1`r*m1RW_-RJCq!{#8ugpr~b)IrW=C--f47k2vWiM+!#0EdKu!&pna&`&}EDkZjOuzOrJ(7JTOw&zqG212~O2 zUe>sGWef1h9$2vy6{28<2w9J$JZoG$4KfD_6T(aD`)$3g8SHvF8O6qKSHq@x! z$}uZ-{XFGaBaHe5RGrW8l*_~#bu0X(N3|_ib-u3y6h6IH^Df_%5iJ_x*N&=-Q#maN z#Sh$|rIUI{**AGscR{c#08-FM|I#Lzo<%JIX(;y+qtp#6^aBHjm^oRYyQVTKwS zR+AB)0Y=^Hs99OI-e0CPWL044#w=?HRJC)qQD2yZbsz%^5`P!12KA53O7CB* zC0w0h)F*eq(@yFJ$ds6|%cyU}Q=6W~2H>;0_`?fobsU^N_hlnS%nC8;PiA3G>T!QY zV?NvpZy4#(vauD`j;1Pl?X*42^1f3Zel)wP+MEi@dxN!`^10dMht}M}_CLkxy9K$p2m`jTOc>J(3#to~C^$)gzC{SJ6Jfi9nmX zQttsqO(@fy5ww3$8h75mPm?Yb+p4YIGsr|$v_Ep9$qIWA@V^q!DX)z>Wz0&`cb@F6 zS?=lbJ)A$_|Hl)j+LndpPS4a}+xCpGs5~6Z%C%RV#(J+v)Ny&HivO3$S6PVsFNS|5 z;-IR~y;B7>WMWHGU$h1}*!uBEuRLpzek3%>w5jy<2k9=AX*0pnh#f_ec#g?@-Q5BuNSlaj>(XmuD zDC#~dJ-cd4cyijPukCDBGM5I()UI$_a`RGE$hoAYw`vS~CYzWg@ot?p+kv3CMwN@HC$r98BH z?B96I_jW*4o$-tDLSoIhg2X{2mS0}oq~149?0j$32W-hyR-F%!DQ&6a-18GZV$Lkki`t(>6x@RmVsKXRh?OC$`L%Gt~SnbLSJ@=j-%*!){yTzVUz zD(_83eHCUKM)xg9ct$%zeV2hjL+){6%Tc3lGZ6QZr3A>77KB>mYCwk(<|gq|ngdmd zlZ<-L!I_G&azUcKS{*JvoE`K;O4bp-drg6=6dXC< zduJ*=apdI0&g=t6z>$;E*v36S$bu8;BTD!KRW<))&^>-- zDC0`{7a*cz6`1mJmS`1MgAoxp1F#n`hXrQGi?w2F09B25H|kG6XDB_A z3lc>RkAkkxx2o26|CQ)mozA2AynTDm;ShVYyf)_ZVMa{1H|iA<(I->eU#7Gm*wq;X z%BiVpNjy=Isy;tA=o@F?nUg7g1&DGL2f(PVch%&{4;c~ZWYqgk!;}63{bfoELU6(W zaNo30jV|;=qALBJL3f*kGvw8N1&DLL{h@ceGwQs`&lu6PjZq)d)~uY~=r2V zFS)v@+O)DYP*rASqrN26taK_YBZ<;Bd!oTxb5sP|Zn@sB(HGNti!6+BaKZ^l zRpmA|>OU}2oe}o`5G65oS1m$Z*s>%ey0J>l+Tf3aE9!a!BV zibj3&$V?^BrXcYIBR>RMj%upgT>(6APgr;aGA!wA}Bhm7ZcHQDV<^gD#E7`d2@EWlG~% zJ2U}qo-LyJ*D5Aa)xC2D{WeyWuiUX9@p$)mc-_lc`?Rz;BaY(g_a~miyLgnJOli!l znLQ3#oiwYzoWdlkD*MKur?*7QaNM^5G5_p1So&bU8rh-^BkJIHHQ5nsh3)Z^DUG%6 zU&TY478BJHCE_KjYG7m3yQ5!pYLS9O@_?}r8t^OqmN}LYhpHR(k2o(4H~Yzy#yz}4 zc??rd3wK}Old)A*mf)o z4>ks+4;(8|)p}c;E$_@!Y)cd*np}v7T6T-VAkybBPuhsMBy-#xT9yE-yr4O*WH zF?f3R1|ONyn3=gI4vMe$*UFp=)2Qn76NCN>*XN!;y$cXcd&NPg4nbPTlQxV9K!4di z^dO`;_{x;V-5d@HFuZ#S%|4)%Mpe>xgFYGk3}XlT6d-=yOaQN|ch!t2dq%kZMn5dB zQa^O_l_@O=%n3%T6<5)lY+N#=O2pXxk}` zo}#LgKwAkQk8W+1&DJcC&Gte55!?@&NHGDj?URwRb^CBUzyUl zd*FHk*vFbh7guMEs*0n>ycK%o(|h<7AbRu}2UVu~O4jwtGU5q(QkS+s%dp5trnDgV zE{TJ*TeYOBMMYi%Y7$=6s*0J)q|OD2t{-JM*L;oEMkr&Veq-v>ZihtmOs@h&%OhQ2)UHsiU4Kqw zI2v`MjF}wAyk$ybuf_ef5ihD}nQ1RHs*ym>8uQ3vhJf3Z66y*4l15djxSBYH#Q9k70>sYPArPHiRE$5(iQ{-5yRe_9Soz45 z7KA9b!Juz=6m)ps4UMY)#{0N}MEpSS0>s>Dkude}I&sX)>x^iMYqc_%HCgPNw@hiQ zC-ZX<{QYB&c&Ev2jjEQlFzN~tb1+K62|a5dcvk-@CYx_EBA~oc4~)lb^?lwlr3JzD zX&;E2nk!DZ@K&R$pAxP=ka$|DAmLHA7pzc&rGIX{WW*ipAC2+sfu`6$D2=s{oVq}0 zi-yu~#nwbsQ?Y+sN8;TfuL49$gAVZI-fStz%8C&sG4iwAB~xi;@{%cytGk;mVBn(3 z(#Y`gCaP+Hv77m>nac1+1&Je}*6>{0q)kr;K}ECTGvToj983o z&YEZ$h6Z}cl*USh_Re6NG+bM`u(^qlH*RZ*`zCz4ZLz-LwqZQBS=9Kxv8Xzb@}S9lfh=^s4r4(X?>Xf?x{ zn5c@zCTM%OH=}qxDF5@NTCZ9VBN~k}>fYGTOPu#&kqxY@TFe(*haFSL_w_eX74=Qi z_V7%L8@}-SRc&=fE+0icbtQ`h_Xny8BU#c6wjP<0K)p^Dgw z-+VX`hxegjKi~A9mrQ9q$t>Cr(&O$1ImY;#sEYci2jiI**#$EPzSOM%MJCOWY86r#(I2C)W3itfKJF<~8Z#j36b0)xv~2!;z!zNJTB zb_1%SzEDoAmcn7xFE8=vS6fC{avPRm8*nDXVYMG|u5>HN0UlygYo~5r0b7}>PL7i)H{}u7Kb0XlK43X)|AHDh9#Q8tH`?Q9&>Hx*`{$d zPPiOx25Daxq+gIZL4EI(#vI6pp-{0xn)(rAMpQ-P^_-YHDGc`hEURuC=)?#bL!dN9 z6c>jTqEG$N7vMOfmT3OG#7&t z?<0DH)BCIGw|o9%5fhr}L}|=O$rudBuF4(OfJ}jQo2TcpN<@Hg^A$O?Bl$ zMqd6EwJY5ETy`DMRDZnR7OxwA*BW3PS{A;;*u-gHy>c$K^iOIM9!sAa9~t|czo49Mo^C@r3GPL z#!$F-ZlU;WSPt`Y(wGM)MvWT=yLy)u*YC_`1ohlf8u!F48Va)wiulR(9P`%F*bOHp z2*Y5f&$yrilg~1OdY~yS2=$YPzzL7_K|3#9Vt#5GgW|-%q#+=kS(x7U5hti8ozl3| z+jkfgE&E^kg!X5c_ngMkIC1UXP`EU(nfl`xCul@~(&#DLH4?_(T&5NcJj|j1G$zQ2 zHTy?GxYtru@ZtoGY)~54Y9B{~__&bP)NMJ7X3*FsCo*0~!(XfZQ|;rIGJ?iiC@lzj znP`|@uB`Uv@M0E~p)p!c9KSRM$~C{J%4#YjXrzhKxR2#`EHtuhqRs!%S)wW$Yv#n; z__2`CrG!@XPzWPvE+?h2Cg8((*kc~1{i<&ksfuQsa^mW^@o+G>sWg7>pM25pxfyvG zrqmK~>vIWnQcEW!O3laq$w|#8EU~o6`x$w8sFcP^&@B^S>$0ZO0pC(0RZ$N;CyuQi z3m0Atkpk;3R4HM}Po4WPBQHOd(t;3ubtJqQyIe9<=%G=SCBwAzlZ?C!Q%-dK5(mo) zjg&e?3Cuf4Rg}hRR^nLrDRq*DRj_3Q^F-Dpk=41}9RVO@LKJ zDo7(P03)a$meM$<-ai4_2UL}ePi_QJ6^*NKq6d1mOGoY(Q(J6h1obCV8f~J(BskgO zjQD-~JdvtsM2QnUOHKy)Xb&-aQ6eL#U!2mox9{*INLo5u{2I1Yq$(O2g7BvP1jwl0KpR}bMx`nmIp#$2mI=_bY*lUVq2i37@h?haWePld zdCTNrtx7^wm8xh2oD)7a6JT!_56$&uf=P_`hHNUibnD|(aJL( z+O{69B|rSi2%4=c*Y)(J0 zkrqip&!dd6WZ*w}nUR-)Pia9Id?WEQ z4>vXHd!;H$V{X)&p3vfCyrkRSX9V>QQyRak1%u$?e^aG%`wnSTMdL%9=+j^*Pm$exGd>V_f(D*4Q`XkYHZ4veQT~5#_5T$XR*dz}3ZP!-U zO`ppmKQs=^3FG)!DE0ZUIxIPn5j2`bX+elPIvQp#d!@QhH?jy8jc0SB)afYb?uofL zH4TiQQ8`NE-q%q>!EI4X?W=r9qbeGg=Y(nQP$+y+(e94s1dT3I8qdwR9|_gE4bvJf zIHFM%%`f0YnPfb*r)W>jdR;mrXq1%Fg79d04|rgcqP3iUOQR~9C&7tbh6qUgzC_EO zdV>*kKMtj_7Hd`r6u-1fb2=xOsEY0w;zU`jq?3EWAnm{XXV1^1HyL@mgs3Ir)?_JAEOFphNL%(2QCbjk!ej{dSSuY^RmMbBG`hrz&tH8YOIj-(bg01y z%O0cWZ!_}t7*QI(M8C2Sdw;)F*H6sbiIlIh>=OEdgk_fyCno#VgonpBNxL?AG0!$t zQ5vmiZ+EC&Vv6+siytGX@14?uFflU#c2%4!*+tf5{&pID<3!BU#&D@^LuuXlI*gz( z1WKbV`P3XHeh!h2#Z+Q(0~$r-L|kqwXtgU>{65K*5i}M;X+fxqRW>&Wzs36Q4lMpb zqoJI*H=`Z+w@nmRJm&p(C_%Dki!$F2f>NG&;=*eQig$aHFIe8psJ6W1}=i8oIWJImz|adVL*OB#uVe zIk91CJFvceQk{Rh93yC~kkU98)q~;qKOfXhw=1#uAk7xw#NY+3AmFd+npH_o(3mHs zaVOHPCNQmCs5YuyEfyK2Sr44Jy1xndIJeV!d2xcqZYhm^pIME-yTlmn#DQ8Y!b`I^ zIPvC0BN%gXr1t4KCuj_s(t^-Dqz)`fU#JaS>BHjAGz*0j*Iw3yRk<6ro1R{bpgRsJ zjn>DfEX0i3uf6Lany8BIiR46JX9rl;YMr#&>d&sm8t*dl_CeAZ8@E1oD{`empY}+z zeE;m6%qJ{S_Md3sEW0HsjVEnPwSv1#HcKrogqWy`#_l+=am{_H_SaR?=Eq$bVcE6i zj%`?WQBoRDGCP+h-P*EMI<$OH-d@Xmm1WP@FB}alJ105e@TnXe&Uzwl!2QlNo@v<` zG%+kQZ{MBe@BDqxc*^n97t;8I=F+7Fy%<3wm6XP+Dw(e(zcb?`!=P|eLDid?3*`84kOwR$AQ_nRO^U+!TlsM?O%RKH9AY2$yy z{2{qgaD$anoo?M3L7$bSjeHuiv^Nyne?nVV z-Kd=!V$jbP%2M3Vc*!w;8T8t?v;6rpFZmVj05A8`tVA`l?3|3h9S4st{iPL8`5~G^ z40=PyEMoiEloo_x z)}vwn#%)^3J*8EuT3Xkj@51|Nkl`hBB4c=0m{a(!_OQ-I_C7j~Fz6ALvJ|IHp7Qb* z2K_{pETx;D<$X9$=miNMbF^t~mob9AHA z=7e)k8@RHsu<5I-C;P5CV_taM@>$B`5D$6nReaL;x8qLB8|=QSJpA+WrM5S?E+gpI zM`=9qHsFL5+_bPMt9uI*RXGnd>bLP53;WhU=0x|d>&1CRUTYg-`myiI(kFZ?XDR1b zG+^HtR{0+>1j29KSDQaSBhhb(ekJtl!5!2&}^(WGSsCddqh@8uaZ& zvXsl1*H^CtX0GGkAIez1_FvI$A={9t^}TUd^FNIB8Qx=^fg7H33TA&U#opzndCKeN z8}xHh3&#{d@KRjek44)bfzKg%7FFb7v^jUpa zZO~6z`Z?CGpfxV=&O3#}$R|bAFSbP(LEk2&aplzxE0{GarCJv$0#sG?Z-d^#D@%Fn z>?d>LclB^kW>-+BDx9E}h|*YTYH&FC4Xv*3%&-Njs?yJ(2Zd)T^Jnp52@xYS$SD6`E@_&m&l2V z5yN0r(@gc>3#S=Dqt=why5~KHLC26xbx+P|7Tcy(LpU+7NHnZi(^wN*&y{G;p%#@} z>hX`G;k~V=mi}TkBk1o^S`fxG9s_+x)Ye)Fb0n&wV-zRcJIBD3zzW)s^D`Jh?}O6l z>)RItW!u%z(w-%-iYIh`B`2=#kAXG4YG?*?0;_mJRg}gmH@4$oY@@bXyO8I3@$>u| zDbyNJ8h!dR;-TlMf!g#}KSZjcqYo#FXW}>*zgQddYj-*&sP&;Vj?UA@KxU>7_l44eaP3e$$fc%ea|5hdJsE0)IWhHnEHvCRS6f?jBqJBiYbB!8R z(RmOjA}55x9Obf>`{@oN=vYf>L1^711QG|{*50Jv(x{5guQ=gVwkC{N^IIER$H7Di zI;WyEjJHP1Kl|A1zs-iWEIPtlZ54>;i zRNE|H~>l=x~Rz$>`hcf*HN5!J~$Bm z^*E~iDCfWkdLNX=yjM>TXy=rzJsj@J>MhY7HJsQ~+XH&IW^2x4Tv@#(s-iSjP#)q6 zE*(y4Ppf+|g3ib&joUc2Z^podHrBXZjA$ zr59UXXoUh~HczB8eNH@xijp=I{;92R-IWn^1xac2`#6?{-G$C+)k_63pA5Yx>Yu@N zRO8Zc=IvSR=ZzRa>r_!1PhA-BU8;TTq_+7{D^{C|&T%<0y!|z4QTsF6-bL*gLH9~f zS`geFcS}(-FKTzUbj$O}T|K0=soIGVwDu0A1;O7wMS45zw3hr| zUsf@TR_@`%n~RgBGiy(3eYy-_s|m}>tK|=@=~VuYXCi+UhIs%RW2COZ*R<!RMq{6XUjJD(?))Kf?zB>TiR19L%VRYA0y~}SlY;^1)=(f z6iNGVT(cU}kJTx%sPe0TaiY%i1yYma$EBzS{qm{~d1L;KA@R?Z@&sb(fkAUc>T5sfyCL$GueyTvYH}%V!hw=G6Ils5GOM(t=Rt zOEjc4sv<>vPGVWC^xbe`_u)8jPz7nu#VAHt)&}``wv@&w^6#OrC-supd}l`9+8|#= zpA{!IzKMcXiQU8(6NIWfq>F8%JsMK-L@!`*I^CyA>IEH5&6(^gVOJ_^caDUbS3$H2HqsEF(V` zWBodV9(6B6nV@^g>&*r|3HxSyuy{X0Tla#B6%R=7CTeD=vl&f@K%CNvAt5 zX1O2q-EhJ`V*o7L5-sWbPBX$X3(L<=p)|(T#*KiYHXEd%@162yulXwa);LkRlnenM z*Gn(zm&uzmb2qAw{4QGZvz&6rB~9$*QhVU%)^l0ma8i1;{oH&W=UtK z{F%w*$7^YPn9_JogNFy~Jf9^sp5e-3!t|avF)+Cp*zeyd?Fwv>H`eAyOz4%Yk2dNF zcvTB+ELZhva%u3nmLu)$8psG5iJ`P0#EdEp(RXsB!2W+`8Tqkh8mZ=lP5ON4*`T9R z)e8NYPoIt%mJug^EWuL|PtBL!4?HTZD$fZTm7z5H`s8y`s}nn=$V1&(REFLyCnot_ zmqy!}rNn{l8A0Pllt%w<-Rshw;%4b;WP27Xvdot9pEM_CxhF{8H&03x3KS)gdR?s}Bj~kL8hyy$-b#C;&PoyC!6vG5z_`lR(;3S1s~$2Z zN=&o{@1ScE1WJscUk0UdeID)%&!(T10?l3~s`}@tL4Sq!@dG?%PL!Ne4K`P~A{F~y zlM%E}P#T}rCx395X_iJlaxhUz5PL9(ROEQ75F4D=#sE+FDBE4xTpspzqP$()XJi zG^#2(*r3l$&rtTC!U_VUJv`sJ=0MocX0KFrP%0y+t);XeIJ_GLk*O=CnmYp7==`ER z?y26Np~Q!K%bZy069tORYN?D~ff01Hq%?YQ4#t6V>};uUZb_A@*0nU~J9cI$##i1l zC*GfmgZNr=q-}RDAE5*tEh&w&@TjqHvP^_z`0`k!su+ydJ==sM=QJOg6C)19!-Uuf z>E0JUhodtjN(+KbnHV^4tSm)`%#f(6Q&)pNWmSd}TgF%Bgvn|QRGLv)I({vQ5p;$` zY23}Rdnn9oq>E?UX0bW-GmKhpT9TpIEcKN+QT5OeSa`8HGp|VF_HEUu z%HlT;!ait;9CM;aP!ISRa$WLpUCan-)hLbY+Tue%tA9*-KTOuB%HqdwzceE+w#|v! z3x~q5xw_=?qY@*iRiiY{$bOFoZN~;_#@gB{Ras)@q7o&jRiiZS`dt_e zV%_G_PMhfxRas)qizZ~`cPj5k^ouNNLd{QYuMxznArDggey=-c>61btf{9(}|ePUX+a^gXG`JOpVzqcY=*;U#Ji4$|u z#P~j=O=Bl-l$J-O>f_?FmF6jBAm0>5#$|0VM^y0I!m4r49NO%pHFCLE= zVCwew6REe?Lj6XYY~|wW((*!^h5G9D*~*eLrRCNe7wQdqW-F)n+9NTf-9)jSXH`?R zW-XzUONt&fJ4@L-qNv>D<2=1mQkK$UQc?NPmlVA--g!)v9TN7BhKqw9S(_GzMSx?! zdHPnLEM?MuTlrYyd3uI_mNNOMt-SXY{vD0kJB5lO@x59%vCO(`t$M3r@brALKK_bX zi5_etyKhg{uV2H;EyHc(FK+Ynl%iS6iAuIeY;*{L!jmJ@r@Og=t#6V();deMCRodb z?UM8*npv4W*Gk^?ey)D#7}ilKAFW}?&mrk0MNYg4PSX2gHpIY2oW}Q&DuK)N z`s$m%>jG8HsFtM19l21+xS$%}HOld)w_1+s? zdd*h{x;F%>dRr?=e}5S3)}FR1K&V~3p~Ss~Djep-xP&A<_={P|SYa(w8fSfr9N_5C zLfVseVX%5Yk{-SnGdAj3*chy{AwRQL(HGp`O+Gn)k~~(AG7qAx}rQM zQo@t;uKUc&Jy%ZS$T_$=^!S#k&Ks=&Rne=W?cof$PYoD7=d`+StIUY7r0lE!ZT#RqP;YaRUg;mRk}}R(K5!{XKlB1? z>6NyTKYvQn-JW8uT74V5^TRnWq?7giw4~VHj97@zYSK=#Qgs-o1)9-uWK0(z|8B_fhd`c^H56hg!F07*G{`o3uUr z5^t@QAY-srZRc>vewU>8-fUJz?Xs4~J16Vg9-5USij8b9ChLRm;VBqhEO);9 z-GN$_3&R-E;6{>O3Qr=@)^ZwavGzYDZE4(2J1#{6RnaF(+rxEj>nthSB}{uCGKdk! z4kqdQx0{u3bF2%zj~g#uNE252XkDiE2CAZOleULr)N&u`+ww%seQGoqnkD1Otyq8c z4EDQz$$IBpvtsOTBO7L+jlmOKa)w&&yy(ehl3nvTTJ_JP8F9B-vR-3@S&2QxX*})b z;RLC#Hc=aW;V+;n`b24a_+8bQDcv2JpfxJP3B#`>eby$7W*o3C@IGo!+bs32GeEQb zIt-|azD?SmAT+&lJ!nW7gO+x145X$e>%uCt(&VBwv!c|x3c{%q{^HwmE3~uwI8kO~ zvVIHCN*Vtjr_oXmJ|mv5yGVP4yRoT?K2d75u^w`RH)4PLRBh=DPUx+Y_2+BNivKz5 z0`Fta>ZVeEdA4@lJsOybyiM93t~rCp2d%DlQOorl3Ur*HBMu#jFpe{6u3&)q%=;@Yp1jzB$TTw zg&jPsJx;=RPQFpc*U7q*n5A?-ZYvicqC%vMQ~R{SPlqysetne2Y{PnS(y|@fwM&JE z0#*5&lXYm8rPNQil{qnTQle!4-zH7EJD3sl>!Y+FZ17ku?O0>ff^8y!s#=>r)-?FXeX<2Uhy(e`DDVqk{%A8mbP!xtowbee&=*S2<0#F*y zqDyc9J;_T;JBR1elaYRSjb!~A<_#HRF@xUzQ;#(V;6Y2vWkOPmZa}xa-LFZbO#*D2<2_9_wOC20vm(9q0t|aLx!?Kh< z$82OyXf*-sQwOUPw!1Te&KW6<8C&+ai%wXb{?^%*%@cj~BwdQiQqCsZ$ebA7HU#!~ zE>BmpTo^&;zLdr)%@>;oz20BUbpCWVptEf{Z>RHlw24j`K^}98nM(Y}32Fx^jnyya z>=(x`C~RtD-2vY)yp&M?zP1ndJyX@DY4h|V z%l@>%iSmi_qyaT=XvbP|f?737W3Kb+HBz6QXSIl>J%Fm9_dGpm<)3H8iI;_UOPP)t z+UfxjjG$JH(&*FgeM)M3;jlLQNOz#BdQIl(qt^dft8v10$3J8b~ik=nUrbNjfYnclt&N(PtdIIHOIe>mo3dxNW(2irloo_mL+VL|ua-CMs1OQN z)hjVY&$*kW*dMi%IWciaxYVMzy=iV(8%9v8MrqvPc5l4o)4sT=`_M3;su}}Q^j(j$ zlr0%{GAB}ZFO)p)+n84D-~_d5l*Vtj#CqxE#NXPDDs6$Psz@n%l~-AcTb7;73ENxy zr0h!{v`eeP7(uNXr7<%zAyZ21`bd-UTw$tOTQNnq|A;%oPTR?xn6~VyG$Zt;cD6*fn64g%T#G~t9r9s}hb{|?Zf?7373qrT; zMd0w`f3)>`S^`xCU7M#jw$4`m-C-wl!hE;{n73`zTEA`12x`?Rjq#{|D}eZPfp)fZ zGoY%QN9O5WOJpne{|{{s# zuf+&z)hI0p@=i+c}>)$cbl)k^UMs``8Xe7#ELY-NpSNtqMw6&)mXvyZ87sxKp`Rim^Z%=zgd z*=2f|mfY|Ms_LCGU%yx*TX7C9DRW|}LqF-GT*p);xe+6%RiiYHgN>(1FDq3yMJ{g) zROK^xz8+RDTNxWsQszYY*d@}8I2Tj@>OqX4R*lja+rEGmhin{8S$jpGs_16(^+`V2 zN@`?DnG;Qm9Fbm4DQ&viOkxDJYLv!jbvsAuw7H1sDz03pD#~@f-lZ}2!4V~8PHYXj zEp;DM$W---#0YBDD2?$bcqg5x@<#jqOaiK!@I6J>#PTwZ8=U* zt43*zO*FNGv)9gO9#$ey)x8@j`kv5iW$M6^GACLtDh-nspU}FVZo&v^)hI0pypsrFgfJGAHIKZeV<{R%`#eAtR_&qcqNU)jHtiJ6r26`vFy* zU!S6%>Yc50S4zs9sIs;m{OdYJ8-LD+5!9+t8qf5;<_{G!WbNws20&Gp=i&Ppf{`Eh zk}@Z}_cVmjlN)LKn$%|mwQ7_`zfZSjpoBhGYxvXzs;WIcMSl^Ut^6!jQs%_P?lLSN zbX)Zct-%Ot)hI0p%RNJ(-+32x-tbC5RiB2Y==CRJH0wbLnG+M@L!m~5gL=3;C#W5y zv>?p4ZUftf)>Rv{s0axQ=j*DPt++Ybv)|>!Q!Nxa{qR#OEapV`s`g9+6bQD^sjeZj_TWnid%fv21MEfC&p=%n2} zSsSQ|zGvDV)|08)2%;+X)&9z^!wA!<`FeAVJ5KItU*Ibl73%?R_fxfN5%qzp==Vz7 z!&p&bJ(%Bpg*JIq14cZ>5hrW`ekGCi1-|wQct)=O&coWQk)A+RwBOP81YuV*S8#Sb zsXgiH#fbht=IiE}7~33XU!d34{ZMueo^ZlVT7YLrXDiiv z+ZV8+m$p5SYP2h7syN6KsEXQi+8)lx)?Sp#OsHtOwgBHG`Q1bP7wB(?W-C|1>q%gFuYELC3@Y_daJLRECWL)*je zYM~~^)oW)OHqn6*G)7NpK~Sc&2+HZv-SjM{DA1@rRZ$v!eQ)QA5pUX?G9Q*@#K*=9 z^a(g4o87241%EEBejHO)qtv~wd2H`+l}F5uLMnNQ=Jh} z!a{v#Mz+#ye>s`bf-qV0hTAjOYelcu0IH(ajuXFLd%&3IJG4ThYcgW2(?We&`kyu^ zjk6`Uny_yFIn94uO`s}j?KpAYx+>)MxT#f9Inl*$ps*1VsI}vS{od(2vMXentnm*Vg)$$H9?L6ebh*rlJ>Q+hF z%AK%sGNtjn?WSv_p+Sntyv81=ids8P^s103t^62ba&#}ji2E-V>cwVcE5~Y zdrs`J{x4J8@a^oX9uHcik6D_ne6Qlja>{Tt*ilQew;pC{;-)czK50s0WHht6^jGId zQ>}Fw?CDwsF47-kMw@H6qs$5Onh8>;>3vM!!mcoaele8B9fvOSrIigMO!eTNL{5(< zGVB>aEh?okpW$tJDAv;6^mpa*%!+QGkg8A4&Q=<^RggImkLO4ES1M+jAL_^mIx3ue5D>iGKWlqfeJzeT!JKXffb2%fZRim^Z{2RSQ8jv%{)UD=biK@o+OVc0y zldS~jI?J4>Sa_#2c1LfMUVT3!s8yph?ujdLTzb^{|FCt}QB`zbUm6Q-k z0TYxtTV@miF%ZPWLd8T3#KbO2L}>#XyG2Fr=ux?VSlAud-SJrOL0^CGK6m~8_^$O` z>)9WNd+*GinRE8pr#uSE*26mzQ+C{b9RYJy7Yt-IICgJ_DZSJhtY$*mAzv> z5gc{)<#IaWbcK9lx`o7x`WNa#m$@!VlMUZFfwLOcY!A?$mat)wg)(HQ4&bQsXO`0m zS1aVC^%fE@!qXdrJE^CTc;CB9W{z)`9Dmec7EE9C!9SV+7W z-M<+WT7OpUiZbE^&T3e*%Cq=35H#qFs)La!;HW{Xm(z&%Y<*0W@l;d5T#tcEq)d9iO0 z+z4x_DqPqAaMaNG%jrRuuar*~5-*1Q3<94euBr)9yueuvYc>X8+ZBf2k1d{U+5m9W zms!hcrOg?+kR5{;Km5Cb`I)HVlrQF-zi6LDEX5}BUJ+g;P!^O)t=aRH zZn%|{H8YcbXKycpz7?C5X+KKkx9-_2#bUU86bqcyux9(K-FzvwFPy0i*t1B)QRU{D zv>jWm(0h%Q#EV?d*5vkxX-aLwTb#gI4Qtl-d}BW%ER0tkWEc?~HT+Qq?ZWczxo1`q zFYK%niR-utidI^4PT;JDHTxW|SCjK&$11}UdJ-HJbufc=+)^R?HMf>{u{5@j{L+b5 z?$?Rq1kP$$vuZ=1GsOMKKxNtSWP+n+BxX=O_9i?x-df^CqRsFFkhR2%9_Msmiz+~I4J_mY&T3e*>QBA8(EFRO zVpY4G;HaG>gT|bykh^}gmUyvnw>eA?YpzVHRmlmQ)v#t&VN>j&e51W0**qjT>Wgg# zJ$9i&e&}K&@xpPA6R7%HD%~DG;{?uXShF5mKL@!f$G)+Q@~MncURB_wa>`m`)nj$d|bz>s6tw)YW?H|&T3c-!aMtJU{!N= z@x~SP0Y~k>vx1JZIwPM_Y$RUP_U#6}JSG%7r0@dgL9E$xNkxX=8MB#6m0=?l&V4rd zS@cO_g}gYyR;qn9i&`dE$YZ^2Sxy{DcZ(ZW&s44rxmt_`&T3e*{kHf267Po1R4&+N z6yqqnQCajh8)2D#)>h($*?B??qoyma1~oW=vl`ZdP%mZ_8QpxUa@4r69gZ?+okf47 zvg^aPvBZmCuFJ?Lh*L)Q^c1ncSq*DJm^Z9|G&vuu+)!^7anu2wEZTytCF?i7vBZmv z$H&MCGFovqeZvWy)v#vWtnOVS^ZbV@uhb3%N9kV8q+{4z(bVIOC0=|Dd_{(BjZ}QE zwdVxRYFM+5i)XdqI}KBAj~qvE)QKILbP*c^xMgf7@nV6AA+*g3Q6?On#|fO(ux5L* zzBGq|RiN~Y%Of~y?UGE|e^-U<*4s|vMZG9%FqC{0gGL)UfwLOcY>$!g&hX3GS-COq zD8W%MI+GR^v3Y})b`mc-xO>12M>}Qfu@juYSq*D;?lx!x=Z_jG_lDgdILbLJlg5;> z8TadU5--w%+d^=ho{}^1E+=qS!&(qZ6WKp;<-TgqgpUMAQU6TZhP|K9u46CpLY&(H zI!jko=XZSJ1kP$$3xat;FzmA1pnB-63pi>(n@oD;3A;Z0>?K~5Z0rnQd{(Mz)~v}1 zoYk;q)wu1uL0q3ssspEt07p5s%%r+sE975;>?K}&&+Y~WaiXfw%9s;4t6?n&_N+5d z>&pv@FTAP;ILgH*lg_MlM)sO+FY!X`+#ObLn^|1vJ1=k^#G0+znjQ+*Qsx#P6HVdZ z{4APORUyANb>jYAUii-mg|x?ui<4}4ad~? ze?R=^7`n3uJkZo4;?-_o ze|@uRL&O(Ow4R$q3)qbNktt0y&XOHRgP~i`TdFOkw+W8I=PN!QyMGu5!OED&D&ySi zoanPGi=JmsuP>T6(Ky>pBmKc6$Uw3CQA}_YzV7hx*xogh2>c4JtE{JmoUks)q8^zQ z^0!Bh8dvS9)h*$=iKBAzaxTG9IDg>du^x1y7uc_NRia0vbHbz~i)ynwXXJ86jqGDt z?g;50+bX?Uj3PJ+=Rtft_Br<0fJdRf;E zq*>#X?g6ceu_&67O&gD?kY{>1XxyC}xaE*hP7{@bF-65V3O^^{(-BA^?#SMFnr;IxN1IazlcqMJ2rwT{m=N)`JHv4*8pQvxeD=xQtal-vs zHtoue@!ukQji;poI3xx+uz8#wT1x%?xm2fph5X9AiBw^oOJ%Hs>R5e}5js}6b9%Q5M^)a-p|@Feo9!O{c&wNA zogQTBma)qIk*hg@zXhyW&&&-AiEq(Z#r^vN?voGMltXW|tB^YzI7z%1uxu@fts1Qu zH5kDO{M%s7#;?*8V%UD9GU1sQ_Y3YFmqXhEna|~AXRg%OyD5Va-nMXgmvfog_eeI)7{{L5L!BjFw6zQZ z>plj`{1EX`!(E%`Md$6UyDA z@Ld#ZL0B}aC$uvxP>r^#;_jT+w`9}9DHZamPtFoAx)?^loLBiOU$4iUz)u5Mvv?cV`L_6T_j#4OpJi@d9rHMf4sm?HCVGOdZh=11uQAP)2uG{ z?9;qBn=WJH?T!;&Bwi$*WY0eGyy8s*d4ZqKux6Fy(jJk18m%NOKd$<+EQe}GR>&Vj z2MOmcocUO7?chCP<(JXQwnex8=txkAvbk5v`w12QFf@;F~qyggvip6)&!dS2p#IQ{gE5PL7W!2<`NA#4mj! z6#YYn3eNhts|xP6!fGat%o4wO_fn1>)#n7h17OY8#IDxUW}ubu_u62Mip}KH5Z8&`@C7*RSVW(bH{Q{;CzlXo2g#z1x9^* zmB{jQ?Qm4>uQ~LRd4((nx=Ot8t84|Gj9V&Ri{ANRf%7@mtapN`1heNjDr2*&L>$%R zW)3}JS0V2ybd`7^ZtDoSZETfIvAP5coX@cqgyB**`1r|CiB$C^IBKpshlV#}*~igM z;>D;5p|ILiPg$uyiW4}WW6e4Oo$Cd|GViG}qSp`{wX`^gwr5Xd&63uLB27&xYb}@;5z`;tfTc{Yw`4e_R9U$&I;}*g?m%s zo>go%{K62i{S#0=UF8MNgIKeQU)|bb$tJlN6ezSD6XTm6&z)>HIMoqJ}s}h>nibLxYd60r6NRmar3JR z3!K%kX5UrpO>!YWM5$bNRfVHEkIkbe+2`od!A;`D+e>dq+r`03SY#O|a8|=w5DJS7 zpq5T2rNNB#DjapcbskM+Yj}P4xk!b)3 zj&iJ(N0*#rYb{;eC0?9-=L)diM_HNW#|fO(ux2@NKwH>r%g&HIsO;I%^O#A!k&w#Uf7NtcEqKh_4(B zar5$2=fe*X9JO_KF5S)6j80q7Oyb4SPlMsh*9=wLmPa{(vl`ZH$MgvUz^hbL6@PwC za8y4fmj)WLwS6y}NxZn;VF2{fYNJ~4?IkC0R>PY07CGD#Uay>0e4s{cz)@+}a;cvM z>yj7XDeaE&|MQrWMgk7c6KvP;2ecDdrmyGnRIL2 zO6k$Ev4W#!PG;R(S*MW2r`#o8tcxlpUCy;shAyz+1kO=dvvF$joRn6!Qf7ayrQoQI ztyj|C>~mzfdPuz3yZr|VZPrq`enyKEI7eYE2oL7egV<}{%FEbWDjfCxXC7@6b6O5& zR}?So?pQ!}Cr_n8SU%E4QB7E@!cpaC@~F+k({hnTGl>^D6)oUX zGbiP0at0@Gj>4L)D;m%NKJB+sDh_v0;i%!8^XRLor)AZeW)d&tae)wP*GTF5p&2J| zj>1|Hq)~c-pj+|SJqtr=xbjn<|)1R}a#EV&Bz2VoeTFS7+zMQ~03Tr{QkUJP2 zXTDJ_-n&S|QCZXT=;Gwl@}0e&5--XPqd@oSQ`O`Fn>c}U6xM9Ff^*UE@YgYwyrdJs zQ61y+=&h{Na?Q405-(2m8v*mYic~JvVVuA@3Tr{Q+;{{u$VpM%{JM_dsK*I;)P;2; z`FX@k;>A9T5m08hM3wSk6DM$v!kVoHTrvbI)$XdA9q$kv6_%by8?#O!vzmKLyja_5 z2-KCEswPC<;{?u8SPQ}zk6sYDe?;-Q7y5vsYVOISG3*Io-YRd27t?flLFa(M#V33W zIDxYo*6eNj&;W6$vA$A%su!2x@a{v^U7G)Ix0|-(E{NZr7$_F8Jvo818rG~6n{f|f z+{IL}9no3AQFvD)UR*MrNnSoSRc_p8yAPrKinAKl?8$P$KC(q=pbS~*tKg{WuF3y) zapi@LMG5im+&~Fy*@_c5t6|ORMa{pF2hAHPjXv2cI12B`#fyDmI&khz110sRH79UZ z!PX@F;c%PbSczTW^1LXa8z~I7;>k=G=cM9c&)5UQx zb=+FjZWl{V;H-uv z(>|#*m>rAnJm|xh1m&EYh5a_*ubq5(;DnAd?ljzJ8+J8i;ylar2WMGv- zEehF=7-rR7f!#}b!^@jQG%3&n-0`{UTOQ47S}NCxZZ7e?qlK>H;NatEa>P3M&z|1@ zI%R8}%%h#!m&#F7{_fEIuS+-ECB|+%e0sWytaGSEa6j!&NAl>!&ZYABcYpWW{?|L4 zy`QIyfhz?kNS%Z>N2|}DfB(f-l}BSEO6841y)-(E=RfQY-Io0#_Wxz7s;``X{nVYF z<iKRYF%e$e%UDvnNSxL=eO65arpD@1TyPsqWr#sYv zeXg|?{9hv4ucRpxO68yMcfaj_eec;k&dI~1s6kygXG4_g{Q9r!{{15>X?`5raV*+H z;ydssMGPQ0hYeuI^==COFIhEK(I%5h<@#oSchCN}4*^><`eVPCw^A2=diD9UTfx6w z3A{p9(cQ77a>6BdsU&+9d-g4r#jVv(`c=Y0(R6(ccxct16L`M?tOY?#StZt=>I25n zUWyItTt4HqTHZ9nMY=G5B{i@um9J~LNj)<2=#$H8S-j-Tj!{!?DjIpUfs6B-bD{~` zAuXp-seIs!E2mlaZ~3g4)X)Z+?dhc8DEyb;ucqe=#UBs5!jyUDoCvzXzMu1IIWohU(`+om;kan!;s+-lxhXgbf7AT8yIp&g zU-_eH;502*^))z~))Lk7q4tfX`=;4+KT*q7DUGGMY}Vnrk6K>9W*r0}=G}JD)O!*% zn7y16y32EDz+kl;-QI!ItmaPZwco4GvEcJ&mkLJ(_R68sP_=wGNmF$HxL*uN9u5zl zU*|;ZiX1wJ9ivcokgyhn#s!KvW%@7}dG59fN8xXj7n5S1_$})?1oEG}=ETpFx%6|o zS{_r|Ny1tXy5Bh>x?c-p9Waa(9EE>PUNq2N?RScOyNlz4RrnjN^D&cJHC4;)ZLBrE z-MeG)it7OXimq!>rlX8r94I;!P>2bLNl zs)nyvHER|ef9b`EZ&4ZS8dS@AEi5FgS*7gdd~tHCS+KvqUJ;IZp22$SH&)A+pEuGF z4+{GEdHhI#hL-z9EY7kX`pei~HHY=k$C~X%J0((lWt;$)8$IB}qgpFyNfWhv;y-f< zYe6V#nkQ~LI0N#3)FC*ktIrC0i+xvn4{3^dQ+@pO9H+u@x6z!)YPOt?^Hs~Yg3TnX z1!3y;x#IfV$q+Pq0Vhr!NT(Cqsb%L&^(3rWU$yla;!gWGXmLE1;3(~?bQ;61sP8$N zBL1_b-w5{@=(4$p6NVd>(SbwM^5R`}C9DO(ryxrVnK2TE&N<5oiwVnU!a(+$U#Kf# zEeM~6EE7G7N5I&|l>|q{uUbZ}qSUf`zNT=T8tOM&XCU0^@|_d6I;7EWX==HKwy}gY z+oxe>vUur1F9?XM1vsi8hV`;o!9K@LBMnjaAlogZmnpolZL8or8NNs1dl&0}wPy#} zRhxA}oa@Gk7T@#e0EbffPQIIjHCvI}ULmO$+@SJ>gMy=Ewqr!7eW`ptNK-6!Uq|L{ zkYQnE9Zuw#<3Kfoe5s*voF;THzQ?#C(Os;Mk0fwLQ zIWhHNHuYt{`Knfq64rw7v*SAQ?)M0&let)hql&E991F|Tzi&He2sl5N959~TmxZJXOkShL6=;9iCrIe?ljgAZeu19t!`5we|7s} zEQCIp^p%}jo~C0XVa>j)kY&VVY8=$}S=O>T^Y!U z1>2X?(@ZRhYan6G#`Jg2BV((^f=$IDf}`r+U^|r9vs~hWmGv@u zJzOoDIGRXUS9fC{Psqrg@Gj>!!BMWAmeIp~)$-7vbv4BPVQoq0J|QrHt%AVf`1_?a zaG_eZ^f#8UX5AJVj3l1VWO(9W0XS+L>j+dYSuKBd)D*X0w;-q3P97z*+&QuKVJaPc zQZ1icXDDIK&fU?2$*YN;uw<_{;3)grOKDY^TFy_?6rU%0l3;_zp!Y`NgazwPdC;g- zeiNZDVa@J?PJPL)tcK9RGXQYZ4x3cE)|Bl_)$+If)TH9et*RFe}pt6?n&2{j_g$MJn2CgZaTN8#r-USv$R zC00YCALP=qRQ84E0UKNhQ&!4=Q=~IuaF`ESAk1pZ_&T3e*@!f&| zQq(Svy%qIV;VAr+$%}EJwTR`K>7dqvGb1m|p57L1k57aT!Reg9Sq*FU?mWg zezz-hdSL=M3O~>BqV1z&;*3TTtaEL`37pliX1$OOnv(ZcZDGq(H^5QdS}vuV&Z^}_ zQw$|uI5asbPQ1Z7(V7!Z;GBpx+x2ag5&1FF9`^2*07qTwm`b%8l*&~^U*g5}*yesc zLhD2J%WfczO{M28*q(!~`Vtn?-=xs^E^Neeazgz>y*feem_#_;Wuje z{S*UE3qpP0n&Q6ap76Zf7jP8*OYrg7lYX|1pG#M7h}_`AiL?Ee(jAp*c}HJEjnAQf zFh!hT*#UlJI{=Qt-zYvF8@)*8>NUc()c~@o0!Pq7Y@VAJ^6Y)4Bs}Wx7Auczo2Q}M=asq!pSPQ~}UwUL& z&syOBt0&;7k-buA)=>7VMf2mA?2Uf;5wUZkF?{JC#tD4JV9h$jwhSX4QNKyRoL<~{ zmFb;A#|&ck^AUOyFIFYE6N@Xl@a1JsPT+ex)@;o3M+}&C8cvqKP9=CO6pwP^(NFfy zxp5SY8*TiJi;@{rt`ZvVPnC@tl0bDf~W2h)+}FX4TYs~>7?MzeuATvhPm{}YPI}i zuBI@pH2}U?tR)81PI01nog6wMkiCBxx=L8Hibi!Li2vo0(_6|3j#_V$Lof7F%V!E* zG{oc^yBe1{~!)JcH7!CGv(t znqoce1oO=EN$_R^PIS;-L330kGBmT2uoeXW$Uw+&$tIgwMGB7cGhIP@o+**_8)=Hi zLuBx_$|en~OgS-ndpgxGDUo~4YA9hX2;rmyoPDsAt+A~KIBI`!I(>JsL~anTDY`EP znDR1(ob6%33BAZ=bithxnLad=ux2~nX0?Y@zd8A zlBSO$>-IZwLVTY}R{^`@h{h7ug3xzsThJfapA>X)0vvUs)>3K~td>i{HO0u1){tS} zl^osS#)(D`Q)tlwHtHNgx9tdO1}sf10Ez5=&abE`2Xj ze#Mg$xnGj09vd&|e!7-~HG50#*_w^cHz6ahH3J;gw{8mEeOE0Hf2%1PH*EorKGr1@ z#1@>e^G>EKT9(SU3u;POv)yjCw}f{!^@&lV=76KN2Pe~GZA)eEi<+YRqc^lHy)V)m ztvFG0MG}q7DV3$KIuh2b8aJ#3v@f|LzCPFzaFpxLB&xN#R9@|*t07|ki-mU|SCUhi zbqUVMcm@m4Y_WALMx)_G?m=R;#)}g;J7dk(H2fX~+ClqBzpI4cr~vIeYWtIo+>LK0 z@gl2U6kKk5hK$`kiW4|HW6gfSrctm3N=Z}iX#_`Yx67s7wzEuK-(BK`o>o5~EpL&c zb;~({voqGL^H-;S@L|toA`ZzTI4ayahqf55mQ(w=NW3WX4uftH4~e0&hZ8v0V$H6o z17TnndyA~KIZSX=-1jV6=FUc=x;sg{aJ4MiEWIT->gkjW+V^n@ z+Xu^5;>DAn1ZwubMLL>l0TwtrW6jRQ$o5d@(gk8WSO;*_b*B|{)Xfrk%XdqO7o!&X z!qH$@?ts-zF#66M>mvsag$wp3tOEe|IKX3 z37nm=X0_)9t)XnpVbUhK5#Xo~i`ad!jXrz|9)FTDUqO*BuX``O&) zg%m@H7pgH$VcxMx5cRAhM)UAC@Np4nYj;)Pl39#DJ9FOs}ysR~yl;93J*gCGbO zHw41A1NGoo;Al>)@XDh}CZ+P`7!L_+Rs%VyGjxtLg`Ug1t8mnTh&<}RX581lan}&{ zcM({~R)LRZW7jlaN?ssbbjavx6WNH#!+?RbLqv?YT2yFRYSB_ zwFEcwRiUfBz zIGiHFrTs}F77IMHX=H#}?!Bprgf;7p8{`R{F8V;5s?#El>J*+$H+NUd2Aws<^)P!_ zZ0`>@H+c{&nt#otWtMCfV5+@@HQR5y%n1e!Xa^65gb*B+V3kD|IH~1qH%(E)&jQBG zYY$(aE#^e@Zr1rrP|KAzwi4E?97NOD`@%061l}zO9^XM8|Bmxq{A)2((e?(QI_*o(8Av(a<_O*(SLbu*ig_C z(%U`a#0%DicKx>!d9hbR32Qb^ZDI;}8{HxH?Hhul-g+&kVLEI~-#}9=5cJ@CPgfW! z>j4&z=rXEi?}KF}W)jwH6lZ5`*uvJuof~ZkI4bSYGOE>x{en9*g`KSy7$38SeOeZr zXtOYl?r6cDcjuT$ShKa32DRWwUVZrf(+Y4@azPrESdGRB_BO$bLnc4Sb@MuK@0=?q zo()(^`$el|?}^3|)~r6Uh7RZs(}TWg?tr7d&R$BbW7TqatfuJJ;uEo4`jh?7mlJ)$ zQt7M$wVbiTP{Nw^drcEyQQ{ji$fGUbD5tno8nBzy`0Updmz6hUruhxx-7J6;uScZN ziJ#Q64Ehq*Y$a0H@1$*=vn1+5N5E0@5>u${54GI5tEPzC`hrZ4+)swB?9Pb>8Pc9$W4L`L`n9%^9*NxmN6kHzOfQGB8n_@$VYBxssc)M?60Y{@M*_S8;}s?OQ<) zWez8BcE*}j6)*CD)rl=&|NX%#9QAkuTf4+YId2EKO1$tBZQ+Y?M=-1~oShKY< z$&O&-B0-lew~BGpi+r|5aVZaCXFykax%=y+_Uo?--njlU@L9)6lESvpa#8J%x zvS_>~8^5|?C-LG~gPQPkR5&b)=t!`@*%@m=NLySR3O{v$O^rqn9ChSJ2F)>J)gn1I z5-;8-{30fq-Qjd;HYad)###`%{nUl0-mL#;S^>dP^S7>`pwI4V#8TqL>%s5I9NQom z`|dO+aCXL85JG$e_$>Itt!>u{jvCa9bqh6O6%cnCNW7?Z?+J;BB@n;rJ120i#hQ&2 z#eODr*uH0Tjo;q>AT(P4YaY~Npx6F56#&1!4&UXk$;&M@dr z1He(k&!kZU_FS@bpozo_JKwA1tbrZ44{OQ^oSm^|vl+UNNqeOsy!Ukl9Mx>&QtCH_ zjYbVOmUuDu(Rq?zuMT`W=feq{ov~)`oRjVn&nbG)EwC-%sLJeAy0lO&Z)A4^UQD=s znk+c=ncO+ki4!+SNt z@}G8|WPHpf{onKl9Az1jOvmplmFJY`O1#+IYk>IE;Sq_RI}~tjcFf&m`uxj@o-TnSL%V zl{48fc%cp|62<)cWLVx%PT*M*tl6wgcnFCh<-~RwtLH>>H=|c1)BQ(E9iL#EAKBJ zG1upW)GUwwC{fD~T6jrVv!3MhdcliRy+krsA8^!X(>ywa)i>9?=&2#@b&G)8-tpo` zS3^z=ZEblY0#SN0F|}Xpajea-AERV)T&^m{&hce9*WNC$fJn zrQP3@$PZ)_32Q+xyb}Tw4|NocwHpDBN-<2MqrbD6p8=Xe&@Gx+N`iSrs*a^gjC z3U!&tGJ`(54SbRSi)IE*GE_W?CG4O0M z9bKxH=TE35Va-+aj5UHDhd83H7^o|C(+kS zOXZeJbtJ4=-O`X?*evhx8@}BNaFqFsB)Vk<8@W5BDGJ{QL7O3S{04Ti=EUv~iL}$N zQh9f%wuCiXZ{QFNCmK)jYh_>!I7-VPiH@#OCNE0V6sPP63=Q@dJ%77$Ge7v>#aa+j zVga@fnImrVa^VD?o5GrnC+;J#{lg-$4I8z^QTY4eMW0^nVTZ{^@$>ekoWOHzShH?# zi2yKZr|8GJ>f$K;JM-d59NW=)yIO2p-h>l)t`KXsm+7kZurKnG*khp+H$RBaS6+CY zlE7}&Gto2IffIPn6KghC^w}T!7<>~4IyrLlocOxq#q!V&aJY#sdH1j}C-B@Y*6eM2 zoeUcm8<84;cHDd|&L6zccMAZ?-i$O?TXO=>C}Yj4CbK)js4#0X_N_HH?~L;xFT#QY zA>@V~A#M1%Z9JEbHS30Wr4#7AbtC6&`1y03&w1gtpIske%}A*;yMLgWd|VTNwIJ*q z9SmQ6e8}iC^|?9#e3#*c&x9`UU!V`ETy4S$uC@W)69qx1M;BPqOd<}y>T>lA`2LEI zCkQL&cZVOFfXq*?%?Vs_fi>%SmeL)Hg&^X)-;k@zz|RT1c>gpEn$D8R+B$liz_lh= z3&M(q;jkkjgmikZ3pfft@9<(;ZZEjgTP80X*5CxLnZcUv&h?@fEVS%QeysV;)yd%J zHeQsmPE%KYiKOkyPn^KDKUlNf>pu2_(?dECoty8udLR7!$%}}U1L4HX=H#OCloPmy z32U~B&SDTu%V|TJU4O*YE#c>AURZ36f~lPvlR>|3ast<4Va@uHIS+-ZlMZB8;B~J4 z3cnBVqF2Rm)}Ns^QJYqBqIzxczjd%!3&I%NXn0&?L_SP7&#jilYifBBdxXHmoxWn% zNLQF|pG24Fl*#)QZ3)*M@OPYd9h<`&uRL+d-qxIW=afW^bj#!?YF@LqR3~rv*ehQg zSl9+|6rRn(#}fo-+Z=9?T(Rl#)|{v>CeeJoGWq#iZ3$~ZAPpSgeacDC??nWnihi?y{%G%Hop2!yt0@1G1~LrHBQtdcax`Ug!*m&v);T zj_smF9F@#gBH7g{m3zPSka*$Ssz1Ef`AxFh-{SaY&MQTtlv zvNsmBd|jHz?!X(Y7`EUqjf=1g%TW9t2tW%%AR-Iesh+1 z(a|UvLgyQU-`4q@z*P@evn~ZQJHy&n`ruTRN^sO6lWf|vty-@8tBJ&m;d}j|L(95Q z``Z>y;Hn3#1>wj<86Mp?fOW(75ghg5dM2Gzht)t*dx;m{Yqo_dl`(vZJHrWF^?)_I z<23SvrT1zN0*x;2z|F+Z&-xLo@}25dFs1g?6(n&sW)uCP;iPEr%i0Y_!7Uq*Lot7VJpW)d$( z-LQvo@Q?(yvEu};dcc~EOgK0}$JnbRrh`4;sAI#^Xp{>(uNIp~yx4Zj2J$|hA+~IX zZY*%s1J;6&*`3WM>QQ3BX5w&EFIY+q2C(yLoUz0U|M`}1B=Z2#`PhmRxat9Gw!3_7 zTQK;%mAFoA1vqMVi&PrOs=QVCh7vF4o^A-PiFxFwCA*KH>J41=fHixA^tFOJN7G3Q z6A^HfPf!Y-^ja;iVDK5<^dw$%W_xCa)(a&4z6Wsv-vO`|gcCc{wZ`2~Adb6Fn(Ou?bd=g!2R3;Ay(2;l%*j5Kzqut5I zR}tL&AdbSC^)S6%3%ZOMPP`U(=LDX?#F};3Xrc=lIul5hRS#~~5`S7=ta)nys(tC? zKkHyl;F(yg1)=x;n(+HsF4;e!GdKH+e>Gk_8gB%NCVNOQ+l~SMyLd(!Yt|o*Wl)+` zL_FU~+$=Ia`*?9AsxAz+IZIs9eK>(<#<6B^UIz>zd*KaoI@gDr4aZjzFQRYOgGsT^ zh+$t3PT(1StXYTHR&`*L{}-}yvO71ckFx^R#9+Vc; zf@Uc;Ty+A@YP|To!V2;i)&{q0CY-?a6Iio~EwLe7v@?Ut_l>zK3!I&KVg1Su0-Bmb z-mDs&z?CCdvrdJttYLnNHRyVL=c+~UU4|Ej>N~^sJZms-be9vj0tV|p>%8E0p(D&3 zewnL!!FNkujMVjnV=L{U)t5p};7T5>1tFlo4Q4lSfr~}kx#}H!*XKnfdzN<1afHbR zshq&|MOX{MHB}23KhPC^ubIPDA>pSNUYuwTu;rIMBxlK-z;#ksvs&lXY!5e9MK^bv z3&BzNDU27E!vdkAsWrr}KF`%(;R-RVSsxag0QmL3F<4jSi8u;BP4Z&Zt57JOW(wce z1o>fsE8VabgjwIafm_@9@a;vnqc{pb74zcj=zj2Jx)v;4lUz2uOqjV%(ox92!degx z1f3)o8xA86h7AK8h38Uvv7oquG#S;OxSI{-gvZS!`o4adtXiidVa;}GTCtVPJQPo& zI*$Y#Rq;NFu4_;x$L!V=C06#(-nlL$zR*)}1Z zf+SDvoR_@xu4VcQSBve~9d)%?Vr^gEgCX9-|B45q)6D_Pxb8 zY7^Vj!k2Ybxsm25@nYK5m!#9DA<*Y>c@Y-4HU?`!NSgJ7>{~DZCjG7>;;4m_vgqX2 zYB_$Poy3cHr@LhIlA&;^$8%2L+8C^>=MCNvy)y%#)ZT{RC|{RM+MM;7u2)&aSP!^Ybd2CAI(s?QF;~k4+Z#x{aDJmAYrb>?>m`pkfoo&1W@~-8-q355Ax%2(tC$9I1O|H9OZMGt*M^H zDzv<6(d9|$;VKxGOIVIy8O`sz!(aA>`rybi4* z#|K4l0@uc1&1T7*_L3Wot`YmL5rCs+)=r^S{YvFNL-izH6t-GRo+a!hJAV!41ik}c z%{qlx?j&``Y$f}h2Lp~eKQ5Viv!013uINgeH0*+ewD~V2PSSEKY)RB16s9`+0)+Cu2^oapn4}+ty7KGX}5=sBpM@X~ULpgyf zYp`bHJ{#gm$@CNCb^oD&qwuHYMQ~^;F}GQmSl|`XShGy+IgLyn_m#|HZ^AeV z|7yJ0ADK=*9x#G?B#;xhiwo9*;QTd#RMn^t@vZ?}=N5eS@gnCzCQ&9jz;3P9oWR{^ zuoi^u*K^69oo=w%zd6@|246+IDEXL2Mmx5Feg8G)1n!Z8HQNm;ei31`u7t`An5a$yS(8cKv*Fy+* zIl@{H&W%}4n%^A2)}U8#osDpI=7s&uBPVdTCaeWvhix8N_-zFIIG@IK zXu@|HUP$B+v8po?u3Cq30{4)@n(Y4v`gGNEZ=m4(A7VZLuHJiKJewcVfj0K?{ zEyhv!>4g_>RM&_yFbe#?w&r?;;cjMFvvW73glzjd6k>i4L;CCdWkYLF-7jY+m51Qmh4G*xHU{k8e8J&@C2l)Jp$kT4+@!XPniMcp*)2 zBehF2NsZgQ!1rCO**bdn020r#+^R;g+`aa`eKNgeQ6|Tg=t#Wi{dOTa@p&P+oII8j z_#Tcm+tD+jHTi1LMgX(`PXnpygzrB@XGHp4xTn<^HBUKB>jpcuiCkTUIv?7IG zeN;+~$(*SEv@h0`|M_;Y7KHmxwZv_E<5ivHDeyRvt?17zmn)C`{S9vCm;b-tTv${7 zzrXojswK|f9x0+yJFvi(^cVVlL1HJzpDB-|93q0%wV#C zZ0gloHP|EO&(qR?g7QD_@B+&;M<#NdwZK=9W z?(p&QKh<=sPT!xvqs{e-FV}MWQ)@7}sQgcL0v7mRVykP$d4pe{xZ;RMZ8%X~cktmz z`Jd_ptXT#2cyG8F99LXa^|w0VUljg+cwx0^r&zUNlB!F7Ja=BQCF*x?E0Zpd(=|2n|$Q#2%j$i$5()02~$mJc+HlE0fQD($)|Yw(S%< zOj%UibWQ^7Y@bXQeJ_){>gY&V;D1RF=3U<=_B>nvsIB=dPRxO1>Qh-J*Q>#6)*YsB zyBOQ2(a}xyW&w^edzM6BUMQ2tyw~QA$EpqOcZ!<^2Z+;8C2%4pAemm;P$s{wrz2r4 z2qqz0M7!~w#U*DG07p%Gn?#e>m&vX*HHByHF7eU5TjJ-`nVe|GzTJK6Sk+5?9SLhT zD-*g)gsl(6?$c)ij*@F6(-U!JvQ~3V(RS5$zt}Ocr0t<8fbVx+Ny+q=OPL&XT=QPr z_wsi?o$;~cQ6VpU*juVWNSRzdQ%Ay@Wl@(6qTRSVVzYvo;2Obl`;;=7iaHYhtMFgT zR$8pwC1xyeC5@*{=L9|m)~tWK;~H_%Lr+pVVmjccFP6!)B(O~OjN^~TcAR>!NAwGc zC9XH)If1_gtOa3T&8uQgL^LUX760el{r8-Jqp%i)3ZGV_xnCH$-+wYE@EsXz)=Mv_ z6>;zhBYl{_QTUF`i;JgbkftGB$nyge;3w+=aHm6=oFA$q;V7&HLC-Rd3=L^W-mi({ zgo^c((VJK%2OIF3?Sc_Li!^CvLf(mSfTQqlfR85#T9wntL7!9N*l&|L@pWYq71+6Z z{H8Yd`wPNxI-4~5epEcOVKU$-e1_xW3Bt&m2_&_(m*~7No)e8Tl4u&cYR{BtYg``* zUuP53EEjRd{CL1o_)5jcW9#U*%_c1d=^R~D!i)IKBzl$QtEh5qjqCh+%xqF~hHy0L zY&_s7oUicl1mRijIi%H|am9Lpyf9tM>d4&6<&}>$v(LdpGsywfh+_M!c)(FO*W%-` z{&4xTNvzNP;)$Mt+ zRmbE>oWRdJShJ^${0SswS!0#%#5llF_}<5hACISzxcT9#S>q>g0zY42&F;0s=a3h6 z5vm=R#{-VSPprH+)?qeDbnHwHEuZj5{2Ld;R~LUpU6{L`JpJTNZcdBg1Ri0-S`hSe z*AuU&-eg|<-{-`Cvpskgh!^(PE6DY5M`H48IK(F;(Xs8z*nS*35{|-}^-lOvMs|>I zqKoTDPCOcvM4yf;lMk}WOsv_R^U66Q}t{Ve!Q64DT!|TStfUxr!8U4)An4i*nK3SaZQSbzF7Y4h7dHKcSnC-6HC)@&}d zVJUfK>Y?hkF8a^x>%TW4{C>uZCRJ);VC+W9PW=`C=7I6m#a~f=U{Gz z7tcXs%{nyQdrD5VGa{q>{=VJ)o6p8GL)l8xRtIOmSt+ger*)Ej@#-N|tM;vAs4mb*5^Sp5EYz&X>ulh~c&kMI- ziFD6-HkM(dEn&^7y#4CH#Z@Q$?wN-Jj>6YGFXSeyHYzW_sFfctR{u_<%YU&k8GCIB zYeBI4W(<|>Runbp8xA-MU%|XM?_39#*EcC{s?Q56!z9|mt6VmdwI!_CcU5Tw?FZB< zZuK!7a1_4gd9iDNF^rkBsCZX>Ug+8-(QAXs<>f3VV$Ei-P8-6TusOx0*Lwnv!q+@6 z4)3WA*78#G=z>Dd_TUSxNxw@eR4dufX5uzo=EzxP*-nwafi!<6ZqG} zn&sX59&CT-*y2Hf?YLi1t16K`99k~x)zOxCaXrKXw9Z-`Jz?-v z=igXkyzx#04 z;Fn{GH1Rikuid64@nX$!FBmhyv*=1QUryjGfi-(8dhZ2;6T1|}3%*<~nXM$!)-3y^ zZPJo>apAWY=yw_JN1yv}0%tp{*?4;mFF57B#P9w!UoIy)lqS-aE6d~s$Fw9~tZd;0 zx*LA_eNW^C&e~YBv&5zuc;;A$Zll|AnOeD-NNL4Zx77%K7tUmsYr3c3!C;J4_6 z_~e4bt**hVd3X^u(i@`QP7u4i=GPVBD6H8E=@@TVQ8qz5^NbgG@T)#8`u64;c8Zn<2 z_$tDhy-hR^hUMM19F2X+MpDtWJ#kkeH5^$k2PSDryvSs$mt9-?A06ApniKdc!kUe+ z3=090O}S>~2R4cku#WMOd@BiH%+0ki6lDS$splQ8$tj>A`bl za$8F+i5Hn$y1?GbDed;g@&aE)ShL=rCqkgjshjQeH#7nqHG4%OHO*xskZrUiUVJDC zVXNYQw=-YO3w#w}&DH{34Tc}4GyHZowgMdGUXVx|4=a=JO=7tO9glT3IvNb`*0%P0 z8pI2HzGBTfI$Z1oNgqr7ohdCd*|_N;6^eh4;g}txAvzk(C&$=dVe78rqUgTIfsfsV-H2WIsHh0cJ&q$PHg-3n*eIZ=APT#Sv^0WUhy}K? zGd?56uI-~@cXxOE&bnW}-*fl%`~36a<#XP9H)ihKIQL$U!FK9e6eaQ6rBSWpEaIqa zxj%Rji1%I#6z#t8qH6a!f6B1jA5`Phz{^P$EM<5*sWhrhA!`|y`@!qq1SD`lI zd!X;1GA#Ew)j02rcajH+y#wu38dW6L@~)1`mimepW_fEcGrg++4iXc)UvXr17HEaBCTsdY5W!>Erd(7DYw8zG#$V zF>4u?`kWVMP)I1I*@!P?tz}rA3{>O10bb=%C}N7{7-`g&kCt!O@?DLz5tC4)qBv5F z7g--?{rRpef@*6S>DDqt8uj;`d^HZU5#CrvB8o=Eayaq#9S$Bo^nc%#MGL}P{N!U$ z%q|zoXw={Dr`F!VHsUY}2NXB4rlaETH@*4mfdBn=EgE}w_?uTl(PKkCu0XSXqn4=u z`<-otGydl9@Jh^10mt!O!?PN_jg0jrx1vwX4+EMzsH*yY|Z@Ui`g-hraLrzjv)g z5})f-{H=-Z4(s~AwU0&PIar(Xl~X8+ zVrzp&{jCQ}eCTN-#$uiL3_p2$XI}iRAERb=`QKX9qVYM1HT828&9I$CqyE-o+yZUpr|PaliMY>_+J#`Y-AHwpq8_4m2d@Kz5S;d3wB*d4{G z|F1Y9H@MYVqWVu6V$c66R;)i~;0Hk6e> zQ4v2mjr!ZNuzaJu!0(E^$8Xp2T~YD3#bNn9s1}6PtMi%V`Edn*K^pb9g=D!hc!9q; z3;UnnoQl6KC(Ct3HRh2G!jp7RoWg6DM*VH+S*~ziBo45HhbUhE;Kkn-pymFc8b_nB zExH~>>UbxhQGZ*kmOGUf2eB<$6hHZ#3B35*lC|9DRAamSOFw9WqSA0Xpi%$V@*ZF# z`s2N4so@6WnZi{3ZIN5*E2?oe9Qy_bEbaEBd`6@G_CG8&CogW`-Rguj+?n;f_}jCv z)TmVB$TnUbGKzB8!lY4u`!$v)05A4qALkB=t5~;F@wbO$d45ohYew-Z?>;+ITwOj# zq*2>H{_W$8v=N0G2f+^ft~}0Wb7Jd9Yahq*9Hbhvys?aSC^nYQG192N@5J&v=fzJH zC-HOKJDbgkzwglUJf|Ala0Yh}@PBpl9n>lhL$v~jPsnEj;-!$PVSk>^EtW3-^S9;S zEq~*V@1?py>6*$R?VCL(_T3KsBdRC!S`b#^+QeDs_qZnK=&BJUJ0RvxhG#cLBdjr+r083XC&JBJLDzbG_n>u&42nt0k){IhK)EPr~#b^5Jc z%7Q)C*G)Z>AW=bI3C{pMFcZ>Iyh`ImuN79^>QN%61>yel*-$5(+H6Lpk@ zaByhl+%wA@6dIKnZhcoZ7ubp;uY&=Wly$3mcT;Z8GVANM#V9K1E8z*mC>V;H`*VdG)iC3TEoR1wH4)iR<+cLi=&qG zfnQ$Ms2-bEN>RP7Wo#L_seR-_5FWB!_9; z@b8?5=~Ay9VcOwJCb?n33>2NOmVvsPlUdWI-QY(+nD+1U6WGpMDTR&=(@x;uZoe|5 z%JajtzAy321{ceB6;Ze<_>~P1dpcOZ-M`-={eId_4%58Po{$Huu!yn~uCqQ52SUK@ z-AdBgFzpk*_nLhZrA>RSpX1|^L}}KhFfFU0Nxr=+0Y#qsaQy_(*(@- z`CykKO%-)oIcAbQ&!tF{+FSpYR-~XfT{2eOjG}}0C{Dz5wMISo&1+moAMY=IMDeD3 z7$@RAtzu)7REcU_YuU#jjyo3wm1;(dptHWK!sSyW`VRSb)k(iiy!b5$UfDfx+t=Fq zy5jg0iE3UHH0>70pjbU>7$+9Cvg$jHc#V7ST-Ylz6rFawIY^^U{*SozESW10bJaeb z607uE1QmiWi8QKBnDsM#FJ)Us@A7-aNAH5*LjA~GD%P~IzN_auk|nBf?d#i};+7}a zzv)oeczLN#`wb@fXwejjin|@GdT&57{({$j3CySFLWnE;QKW*tF4Z{mbN;XxwkZ&T zgPoNr-E`VH5zDBZEX@Gx>t2<3Kjar*vd}O;mS?rV_KMY3s+}FE=`cm28L;69Zd4?nu${LrD56{T$MDjv89Il z)Z!Ogpz8#g-*`dmL8@{0qyl!(Kfeit@A#(dm>#Cp#roX-V!YI(o3(B)7?B{2m=LBF zFKd!(Y>me<8lWh3r3vJ2=LLNyRAVjLr8N|5b&q)zu~U<~hiTOXlU%(^yd>7frzrmI zT{%JO(Kbvg_ZE8-Z!Nuvt&1DL*UDwV-K7{O=sTercS87zc?<#TS+%{j)GCf)+Ae&` z9KW$#8uKgk&l5*g;-#DQ@!56vg#7PrOBt>|o#E%u^~~!4FX%g=8hi9d06cZw*t}{E z>MDHij+al!mD86?0nbAG@yUjpEBxpTPdZ@2-6a7osf$MSe}DjCYFWMMV(pA zy}Y1LOR8}O>*Gh}?pzo=1KPpfs4(r}?-O#hybNhCKB+Cghl@T#+Ljuor4%>GwSz6s zbLrbhmV^7^EDhvEs6I>^|NVq~?=i1&-`Y=G*_%!tuxn9ah&>agy~Jy`O7C>(ozZ&j z#??ueR^1QN+Tn_bn*Ui^83WsHV@s-eK&MT-D1RbM+gjHopYY|iAk2Y^Y*gF1u=a+I z-Ds%O9Pz&U-9JqVs;AQuI^gqsTAGwvOZVpv&cwDh&a1_)61y}C2Isk&+x1|bb`ByRT)205`k zCw}|rv{qQg!hiW^JLV2XO%X481;c-LYKkiX!Tst>|Aofo#<^S*JO< zndB*3Y{l?1^}u&fj(E7PJJ5C;z53`?iCKD0T0-36Z1ItsD<^1+m1;akv3W}vcR5?U z+0hkf)b)zi`=h|v4DMdR^XO~0guR7x#7SLUxt2Z^^p)`GjC#=;p(GN?_(5Qd9#EaorM*XMRV!gRFxn2j3JHV__{od)2X4fR3R)h{zWz4@KEBBotG~+O1Ray3S`fZnngNaTvc=rH zIo!zI+QZg&b#X_6#EVX~-65o9n0PRqL_`CHkg$nxZQjO>Ked`RxhljEUwX3PLRYX4%ZPnnsTJ9j2T_KdceEmhC zV#y_Ii)?y+0@rfFJ>m}xg2&ZE+4E0d6dFa}AuUf3eA2xkwnivh8L^EMMQ}veGR}}x zEJ>mo+dgZ&VRA_v&tJGrp;7e8;6;I#z7SXD0)xO^6=X28UU5-Lz!#qwYgMO-fS(yGa|+2j9XcT?w z)ADfr`TNG;h+=MBJ5JCsGOBTw>|JAs!pwxt@$G;{(H0UfvVzLNu!*6ptG5Ry=$IVU zILG4M5GLm*v1iPQ8@Z!>4qoh?-X03oy22{@l~ZY-jNbFKPlYG8V0R z;%6KY#{NgeYKdIG4R=sp)g3}r%zoJNRH0F{mZ0U~?vy^mpcaawSJ!f4@J(wOUjHOX zRO1RauVGNxoX=iASgX(|T1)VvV}XevqEHk^PDp31WsDn~EK!YFlZ7V2RV|+#+UBUx zD0t;0p5z66uH>@~o+TKKqO}As+ASLipY!wC%9pX6X!gchhTX9= ziE6w*P%J%~&%BDpF&af{30{Oc_lDzn`7ERIRZcX3X=nI;9Dl*!GC;+VPS!HM9ZHv|#u1j1&XA2)V(G9lK%;0a!HeRnYQxmS z`K-d+W}Kk?bEAKob=Pc%PPHhG>iq;amXf(GXWTU9&8PADTI9Ftu%{cCzBvFlXEa_dqf1w>j zb%|GK6s;wA@&2Dauna|ChdP{SQqWq)e^Zkss__Kkc7345JUeJovW`Nd=snMi6VE&$ zHNXy*O)%tAaZa$75j8hOq8i)nk3C`f0y_w<6P`<>=snMiq3im>U=+m@zlc<%m$a7Q z6PPMdjXio4j<~P0!}>2GjiR*#FBJc7FbGBO@=F;N?sctYeDF(?sKyyA6m90)L9I$l z8I7W~1TPG!9U&UU=iYgo=)kOH6dt=mq8d+-MDZ_vyQK%_F&ahhd0sT1(FimYb@6Z= zD&i+u%XrZ`U7{MteP%U+Ym4l_@x^aOqi8L`i@kAWVH=8!S~Y+QIul2=AiR$(3%>q# z@St%Gpi#7z;KllzFWAb}cJRuzB`4_2AJsT(`MMGu8C(<2Zp4*`WPXs2A@ZVfUPx7O5zNvIXj2zFX7&^>aMyrZx64iom6U7qzTqirch@IN zR13n#@bX~v_k=r-ZyIS7z2|w6fcs231>ngGeWY9}j0S5NS)M5p)i~*L3em}L& z>c6|6#AOTN$VAd1cJQh<++Q+Wp;5G!pylC-A$?D>OcY&OSL4LG+txBR_fM9n#$6+N zo@6cXT^(?#rqC#Q&-0>jt4pj03g3%2x;vvu{!v!TKKIq(kOb* z^CGF#Rn`r~ao2LWRQO%Bmhr(YMWPz_@hWqbox9=*kX}J(R-d3bzIM|X()aq7h_aZcx)}h(IHi$8uwy# zIm5o8@LX1m(I{F=@S@ifl@-I^qx{ProVfeJTE_NesS?#V2JlE_zwna}DB6?JC|XPK zqC(ZJ>^O>EIOa~pqoUUN>`6~jC8}|k=IUG7T>KoP`iC+aMQaIOOq&qT2BTOrVHGFn zoH^CF+X4!26feiGVl;}@61<4BOJtAFdPB+LD>*^u=&8op*U9VIvzz#PY>Z+wismHp z!h2vS`#IAecDQda(%d0hOVBJEL1=Q+i&b|Hz%i2|3KcXfh-w^}$n|19P`u19qR=Q> zOYp+K(tK7DMVq<@ja1NVGpYq4@aH_X9Yv7|2aPm}-t)YO)h}VUP`rKHof9;hj%wUJ zDS8R(i{j4g?nW9#?|EKqd=koLpy=^+`ync5Rv^{bD?$;3;*`&hLo|xs^Sp@hU&@A{ z=v%&yNCnMqq#DmR@LS5Rqv#x6TclC+p65k_xP|O2ir{Y>I6*TdsTPDmu?yJ-6p>{& ziZqJW61-UZ%ZJ6GsGakL6Ewq=YFq_Tcq)5`qSVqaB8{T=JTLAX@6Sqf41k)y>M<&4 zRw>nj@ZH#-ZN@UjRB~W6iq;am*sXVBTT#4hCUb&jh)^vEi6Krb*z(DpWJaTCEy0Vo z_UqYd+>g9pP@G5w%`c%Ea}CN?V)v`gg)AREqfs>XhZoaJwSnzf>y>$n8mN{zh&N}< ze=^LxG1FSeUHp`v~Ns=Xx zv^DPQZOJ3W^J^Decl-Bou{eZOIX)8fQkIhPa)_GRF7UyV0mWxy~ponbN$dcss=HEQ%{$dN&&NCm#xh zCF7eH?lYIT-9oXGK z{GHcdOOz}*o^SQ$KbfGoU$~tk+wnS3WwB?CRM0DfYRnyc9LAP;_^KmbNPjX+H-?-4 zrNOKrscgf%hLEb z{2V1Nxj@aEVa5*a9aZ{Y{;Z-CPX1XrXURMH`${-oa(=g4!Pmj+h(`Nd>D5Q?J9;VwyY*ZVq~_l{Cobut*V^LimhF-xQ9)lx5Z-lOEM5s)s2&fh$*8EjPOmkaZa zC2|_GKX>&KbLY%chxyHBG^(YyUh@br%T1#bY{Z*&A!3MqfQtXmi2~>JT1S7}e|K+! zL^aO7`bUT-vVGNm8mwY8N|&kE3i{%{QODwK#O;4vq3^s%<5s05_Y10H!?dEm&2lY| zIP03o|M@j>jmcpNQa9?2rTiOl;`6>RttDQ48!yL5R0~4<)XuQAWumcCa6^?w1_i$Lb!ipm4Y`VPS1fOu@dvn!9+P4~Uki#$AUn+pukNnsH-(O_fG%EUnYB z-<#z}Wo?DYwJ&rvE;GLGS(y``aTUa*t7iF%LzF}{t~XfQ5Bk5BfV{|3ixrXI`AC&Yrb{6RX-7 zw6oLAvQKb4r?K`)_7QsrOjegoy~t?Pj@Nq4;DcA<(5!v5$@;;Gf6)j9588I5Y?XwY_yGs_n%Ew>Tvuh$np4<4sxR)5E$=NdF$ zFSEP@Gs&r-uY|LfLb@39afn)@QgNW-@g{?IXQWvUz7xl3JR{dXRD67@k6PnLWuQ@~ zMjN!7L(TGDZ(DJ$=|*vQNe|VnZf#Cf*=5lDhnwY}yW=FPG0S4+0dZ`_&gz!|4S`1O zjxuPq`k3Vs`(tgyrI5a2M2@@aT-O17uNt&}`kUqax^WT}^p!A!&S$Gw<5qk1($&_S zC{Zw6JKxnT`_7ByG~R>#qQ#hYE!7TNT!BXQ*=x{TJDcT#)og|1j)~%)6K&PuJK90d z!r@vgeBJspV=1vfc2Hdxb>YP0M&a6)j@X*K62oa+|Isd1Oq)_&o!YP$ z(5Qy_2JIK__U0FBD;j3zh?iHER)-%R$cc5X;o8$yW_eIxj6^k#U!|`R+kPpm9=|XQ zxTyCAEg4U!cw5z0MBN_*g;y*w9@tlkyKDE)$87a`SSRj`kmwzZb&35TxZ{;>oDxu) z6B@QGy-%Cv)Kd`>)tE`XU@%;qvcfpVyQE5^%7*JS={D}AH`G=f|1b=8o5GBx-HLGH zVUA9Fif5Ym>6b}VN%db7ndDQ@D-j8#5X%%wB42aPyl& z#V>4yJMT2h0Sm$3hjrp_M^Z8ps}=5Kz% ziHst8tt$2)4*3`)s_{hVD-&U4b-gkE+dYLwt*x%tBCr(}uwHK?syR%8u8*e}n~l81 ziSteL+8t~&nrG`Js<9=rU^2Kh@iPu@d{LoM$CzGwjeVT6u{s;!gs17Y4;f|k-;sLF3wubNHip>|mTbELWjX?*4jh(PZrDT?(}k3#!k6Wehq8fMW**X(uW>z-Nex0MxsN>7KPN25?1G4Xzw*g`F-7FskI z26qY9{=@SIwElSCk$aHdo0yr@c(+*j=M&{c{&-FZBg3`Aweh5;d(oW69r%|di|!w< zDb?0a0veT5B3v6>!z@?bWh?AT>=xH{-J=*r%;3a;3E|qNDtJnef-L}|1tGQib}>Si zrPS#-3ux5M8sXZ6QfB%21Y7ZJf0Fn;YnS5vZ3cXr9kKC^ZjgR0!6)&Ukvn!xpx}EFom@ew z;J1(yx3P?)c=An0k7$W%Y=tN85c{1ip>*HB5NMQr%W!Sw3p`h*jIHSOZJl_mP6g#h z;zB4A60UW4iEB8UMoU!CSHiU!zq7>tqYD|=e+uG+v?N^necL3Dt%h(kDQFJI~$`i>qSdc&{qPfR>TIa5zB26*%&R5 z6Mp!6NO>k1dPYlB#Cx!3CY}UPtM*y4`W7^pc?xt-Emis@g0lBo{G0xxtHn z7VEVhSa+Q>he}in!ioyBVa13Cx$b+i6dE-oO|KnpZI&0MFSQY$TxP@mZpPf|KeljU z7}lac%A4iRexVZ8xKm*vUpO>0Blp9~jS7vrw_dNcsf=gQxh=I384kYCBYtGAe+6FD ziPdY5Kbqusa;QW#wq#;_q1ao;+%~J$DKzTZ7QJTvY{FC7m)eLDYkc9QPxnL6ix)HE z^jeK;COO?XRH7Q!(eL(!`&H{6YK(cvG^*oPy_Ry-Bs+gyVk2&D^M%4UKD!qC#0$@8 zy;fc|$x{b}N>t-_wb&QhygJ~zy6Ad^M*ZBZ*IaW=a^tE?ZN$$0zR;?DvRg_%FH{}& z?(wXxGx4Dk)q*heR~WO@MvPuF8+^meZVNVU=ET>f zdaY>&o}rKxDp4&6=Q3u)^2Uj7Q{HV>XjHeAdTm-V)+O_o+K4r6XTyVA1;wjJw{Swk z7QoP@Ciy|NFo|kxUu~HMUj6pDO>Vqhp;3CgN~SL`$y?qpwGlOj?h+3dThAT@%!c*j zu^!xPlG|v}61@lMy@{D;NpYgXtV?X^cW+KK>5V;$RFgcTX$+_Fw9SD=v09hY%xT~h zpi$x94Vsv4lFz^6%ft5Wh(z(9OJCTB_oF%C+BsY+9glmfkBpJ1##KTibHuOyuUL;+ z+c`jiSa(j8 zDHyIf&Ns=kus=vOo{!^tM67Jc;y5h`Hx?Wh-&AV@-P*JV z8udKfpuL)9k{2K2%M*m>rVw$~G6~8bZ^VgzP8qZ;AAAlDjFYIwCui6;vHfaSn17}P z(5QwX2JP?+llT|_+2IA9@vR{;v}l^uEkLU_gn7ZR=pn3 zs8an58k=a6>u1;suYYF2^dlw2BYk#q_n_q|vpvA{=NU!sM|{?1&4gdUO~n;EayapP zqF!5ypS)dW*qTSfE$rB-BRJd4o;{#6Q ze$#0wwXlpm28n7xFih}*Auf}}QM2zVG^#;ay>_}Z{^pvB)>tmldyw9nn7#9?t(e(%80d->!r($J&aYFKdg3lfB?k#$86m3mi#}!TX~oj-*nJ`-^%;h)vXS5c1*`qfz2j zy>_WT?mG34t?&&=5Oz+L68{x!7skTZ9PuO1RHmkq+Y4`_m!f$RSQ7 z|IlkfZ+4g+W+j5b{%EKeYt(61 zJDKFsW0NFrocT%aj6GqT`8oU6`tQH0TV|1q-<&2c>aqw*eJakVSYJc0^~EzT74Jk& zV++}Q(9OGk5VWoIPNY%q`s=msvPl+k4?KkS;o_l^{&1sJI49`$Mm6Sa=M`epYb;VvKFToC zximWCN@rqmtgmYW7Cd*Mda-2-PS80os&U4>W)1fJ(L(iCLUoZwb-Jw6KI4qp;QtaN zUg+Xlvzp5nsE@jYae~fTQH|NSTN|<7cjv2vf-5o_rE8(rO3uT)gUj&}FLbXvvRQ@a zslC^>;02lUq8dMW$#!h%^0{j4cwa_mVzy7!Yc+9}tWPDJVv_s=m06 z6Lgk@YHaVWb7S>SPgAEg*n+d-|2Grkv0blyo?@0~iOVHk+^aT#c} zD;qSwUN{Tj7%TB&aqa2sS`|07oojtg(Af;C1)=}K(JW}`6u^21 zS5S4H9-N>fsZ`?{UUdq~$t$7CyZZu-s2h-JCwD*pv}ae|JEQjNPOU7XGC z?aEdb44Vuzs(=~iAWLF?Nr`BQ7jt$jV%v6wDyMPml?pntNj2_(>Fmc2t_oCKbhCg) zHN_rFG>(h5$&ZqFaj)+pwqj{jWu${2C+H|A)q)`Z3Sjf9mQ(D_en6vwt{b#|IFefR zV3fp*?CT5Io8`rg9e(2Jz+}9Yj#*NT8S$xs?CP8XM&HWwfJVK&fwQkSO!A~%Q4%kL z1Lm{-`!|SJrv`9>jyh6}s{s!#WRu%wi1xh$fJQCB8O%T&BIwF?(C_68m*@4A7|R zTMgPS99!BD87=YR?4_x!R?h-3?ae?=(D4hZaZOy+K$a2pnGN}82+*iDYYp0M9F01* zH(KIF-=^c)njaOQepC-m(9sC0aV9P`n6biTz~gRDpixcq25tK?lYFC5jKqt@9>ZCS z@=ai!TSrdNkqN4?O+9%L8{W7+l={yFXw=S01`UF6)L?Ur#EVlEJlT5Ofi}m~kP~!l zfoef;S`^6obm;(Xd>R9d>f6bn#rm4$JXaiHA?4w^)a`@Wv);Iy&djQupkoVE;~2mm zAGRh+f{Zt{fJXi5fcFQEm)sp5EAb-cR~NP~v>z0xRhkpDS46cSY?(Qi^@!;OFT0ch z8WmZ>pe5kwN4vst5-;ACb77vZM?=!}r;G~Pub~=O{YFk_ZR1D4>Zi{bjoN=vuU#F1 z`>N%}NxT>!v|>l*`oP=b2RT9eI8^*aUUIS1e>Q{1zi7cLW8 zv4N9kL*Z)6IYE0VRO4xaZ3eRG?PtK=j5J20QgDRj4)%&7t}mB(aid~wCV2S6yUO02 zpsjwY1!3gYA?!l6xe%<3QL!4_-OxiV8f&M}sGM}278YriCt8ujZ}2T z@vG6;k2?G%Mxq+8#JIZfOYNq5RUKfYQC^pHT2p*icN}d+uXT-K%zR0W`?dTK6{p+j zwQkcfqY(wwnDOh|82;@hsV$A7NTb4v;dmluG&Ua=Z6g|va)fCmT+}*c_HjbRoQZAY z&2k1l2dT!Vv$rEWYwoPBh%3ox)Cfn+vz%&{S8R{65!co^LH#YQ)MDSAIMFi{>yp7{ zdFzWPiE2S;QP>H}+-afix-@~&s8a*3n`!9o*X%*DPy>dA5?J$nLx|-!z zk0K?i@x+h~B77KHM(uw42%}M#aV9QA!hE(_BfgpF7_+#TjU{7-=gpE=?6T(2czw#eB= zkrLI|^SUlWQu0Y<(v|{1qgw3OYsc%E<*yARY{c#9-N4nnL2;Nb3ot)iL{C zghVy&VqUZ>yxg}^DYm2x(5Pw0^jbd7@M<@g*$A`J9oAp)QS4V%)DBgEMzz3<-`w9OIW23MjTq?T0mB`ND*LC@;KUAmo_EC@4Sh0x z4x;e{m+bB!Z}@HexxFUPDCLq~b9`lzw?^aV;6$Fm117e9mwRDbZBBeIY0#!)|HC;h zLZVs_st@&mU!@-92EVBdG^${}UTcM-h+&zHSWwvm#IjKy z%so%^fEy_h;+>1NfJPO-R>oGdNj{vs%tkD((;a@UYsLBnRp-Pk!Jr+${E0_LA|$Hu z9vtZbQ?52*0|To8joN!kuQAMk2sJLV5$%t5gH7XRvd4jyII-uaUYofOb6CzrNL1r_ z6CvGURl5nS?2bx6qsp4~TIO!-rJh`7BQ8|w3QdEO*o6({IC0_)icQ!SEfXnGjiUym zy2H?VG3@!MvOuGz8THzQb$Et!sR$e4bWn!0nMc|24uv@}^R`|ao??<;jEa<~#^3x+ zR~UKi5G((*Ake7ATd{7(`P$ZF@oFdK;Y`Dv&QN*h1C~(f9iw9BWgMqoZjuj#MM_lT zISqMTz&_y``}*QNqfuWl>wa&fN$#{P!bWUw3UI)y0K6S`lM}BLy%ve{=kH%fN>pR6 zvns=ot)JNKhSwR5x)!O|`Ygil>RW`3cu~m}K98vc(yINOh+C`IPWs`z+SDkCYMg0U z(g}W_D+4v2>}52{l7F`aXDvr9inI}nTeOG%cN#$E!5B_BhUm53lX2$fYm`Jao{HGd z4eadefN@eZqfy8E>9u1x+vi=;R?O+?1Z$4AfV`-2ocJ_fuQ^RJ$!{>ziE3O&Ujujk z>ev`sC;BoPrFrPJI-^bUh_+ES;$@juP@!8p7$Q1xVxy;Cdoau-7so6;ss*8T%l2@s zn&m1*PTWxcI4}{mN*yUwIWucS`d`Z4sfBG zJ6z09HqxjcSvsu4h9k3P+kCUjzk%a;DbOtNNJE>VrUy`@ybwHaMu z(8dJ{jq2H0r(JGfl3U%4vk{$J6@pdOd%|hh%!w_(!!%P++(Y0*Fg-Y03+Ot&|xvL~6 zs#n7GmAICyZ-W?#YP?D&b%lOgb}Iwh7gcH0)8abq{aLf@x-;5Fd|BHYc9+cI)Ar&gKb8<>BUUaP1kX=wQ!bis zapGTGKRPPQEO+@DDN&8<=v{_D=SRDg*3T{|G-^|zPWyHU*Rc$>6}5(s0;h3Xlnpx$ zbK=WxJk28mKl#%LiE5lH>M#ac4&0&SHQ%Mss988uT@=^z6=`KFTH8&8%k~?T6yrKh zyuGf|)L64TwseFoObB;QJJC4^CHJW*9iJ ztN`XGF2+?tj>{yf1!2d|sZgQhN~Q14xeAS1`ctQsh%w7}jl$^I{k$ zT4KH1ex_M|?-edljptfEnFYmf$0|dwhzgBzs*5d4Tz9w9%U~leKAVFps+KAtLSs(s zb;I`6D6`zzXppGJUCbN$LH8LUO8%@e3XL+j;3vn7_ye2uHlkyC0Q@p~DMuH)H&PLV zeYLe7*vDyXkf_F$dQtPBTJ%`u)Q>zPje3F4sJR2oafv;ca!x+ph80*o~34(9uq-OO?uKb?(O_G}?MZ&OuSx>w{xBkT{_ z)iujcJ@gXQxT8bQMX>sGd8O`&f<_uOVh*kbY-pDKi|K4ch&~AVJ-lq}U2j`16&Dui zwL&GZe_m8CQ7s64_XWZ6sFTLj1J1cLsy&K(rOmSYp)ea!$q)>|jRK5WjYAGmF%+{V z2fj1O^=|7Vs`36v3WjUtCL101<+{+Qi%T#w^Mgqq9usCG>V6G|8+%9Rwi~(Lm5NmC z(U-q&k{eytNmL8M0u;OF^~;^$cHEUl)k2YS%_MgY3$qdRt_Q=Qv&F=eZ5ueT3R`3| z@-V;sxlW=Q&t$z545ok|Zov!My3!~+6c_%*Os9-68!@dFmQiP&cze>QLsU!%)N8M{ zVf(6%UZNUTllKaS8Z1d1^{I3&joNK#!)2P}`Ip0NgiBx$oSS_^ycwY9#NhzFRs=Ia zFa4vJs1^iu8|Kd6J0-R*9Fa?-3Zqcg;&=5t%trKFvIsUlEXBggU*$wQoN*tDEq$Y2 zFHtQB;^jr~*jZqUFPAjZs181Qt!#uzF3?+NBNoiZ6C@3|_f^kPoEV9DWIot#ul-Fg zQH`fs6|9tTC$3=4a2&;*HU^1m zEMrt4c(v@pHp!Vr8pW^`egX6PyvpcpMB2yzcqh+d!JDpf;t-)C}Ix$jtyre{AwsvRKlA2HMWok&kvWV#+;&a zb791kg)Ff^J%vX7uBq3~OD4JJ0)vhC_GAW(2u)#*t9x@Ifl*5K*T zqGl3%8$L~;Q8nM|v>(k)@=!y#jcC+R^C+L>hh?D!rfdV^N|Bf3uF>0Modx@EVt$RdDR0~4kI}_mO zVhM}YfEGAE;YhN1o;n#3P*M`=W%(Q*owPtWMF>cuOU$q)q=3=%t)wu zX*2U)lBdw9B9nF6T|80gkQ!+tUKSq&z8`k6U#ZtQF=7~I8*^oRCjMMcat-|GGm9yS=PTc2Sjz!Iy9kY|MeI-Yr(58c)sqr#sYc zx|QV(FRIe0-MG(0N6cvSeiUOPPIqyG$#rwsjq8;-(Zvv^js9>#u9%E#hKa^qBbGC$ zzc7<^ol{ArQS}3H9sT_ivVv>%dBLWyb(`@p7?zITWZm}zdySTTKj_Ixd_(&L$&0-BUM$0H=YwE4Z{BI$jRecE>{&u*fp~E~e1ltc6j!Hj=U@X;u$F?Vo(L$TKJU?{iQffJU!W&WN&NHx|zi~Yr$*#6m7XV4)UMNco} z#aivSxIHZhTxwP|($f!V6xBF>HM2Tv(`*40iulF}OZMO2lOCxSgyyFTurV_h!MiKL zMjA!u?szfpP8(J~KM>l@KE?^U2N~6v>H+x>F3c+g-vKdpB2ov$-%QXucrTSW`C-VVgVx)J3PK7-`h4H9D;# z&UqcKmLT!s(ApSQa-*NR&Does1@#*A6RhMk_F z%GcU(g60cSjr*#(XRvvxQ`Lth<}n)e8S{7Tr{SDeXq?20nFF@4ppZ#wJwps9XucrT zxRxw!1B0w_>iC*F8I5wpbzW_7w(rT|ScwJirMKofO$UPDgMd_k)5Or+mNcF?JwdSQb1kD$u z+Oqy5kD0nYR$i3r12pQ!bc5CeGaBb;Q4%lYyi;tVy`r35I+znQUyy2CCA981dr^D0 zB3~Z{G%98h?tX$9jV~5ONxW#a^E4A%>XdS8#&Uw@3sQ~a)HhAcp=XeizGOVmD0hQF zOZsk-J^DmRyqNRtG#lNlx)S8<%?X+>NHvZQ#-C*AwJRv@6(<9Y8X1kN=w6uQQ*ELo zUhD}u%|d6CH1_W2!wH%%NHu1XKRU%O)+l5Q^T(VYlEtXTU{)B;56*89CGleDfK$x> z*e3CTc?u_Jz97|t5OV1>JJEHO_&#b1(5ShQxYrA2G){Mol6c{&GqWW^ch*Vq;snhX zq#85NMx9|bJQ$nh?FBT-FBG#s73>>~iIRBnI>O9q)iN;WGUGTw^98BKy+!;_u@<-k z)UM^@fJQ~&3b(E&j?P?d_k%)^K94|wjgL7n-V($Xw>F8 z25mQHG>*=Ul6djs%@MZ$-#aX&Wh%Ue@{(p+n8@`OG`XIgJdy=3^8b#n9=Budjs&|>Q*DO zPpb$S(_J`0^98BK%w_+R>`9ff(7&Q9(5NFK-XECJXo$eQ6G(ZudU?!#c6xtPs8O^D zCuqJP)p+XL^%LxDxdt%fc@v;fPwU|Qfnyn)i^fR2Sl2m+T^b<5nW`E@hQ-wXf!8iz97|tFn@nG`(p3{rz4S!Mjgi0nHT$+zTmeR-9)8zpo;a7fzhJz?i-02`Y-Vr(WEChTQbF?tsTPECzUgfI?m1w0 zdbJykT8y(Yrx>n2dlxV9qUz#VY`%o!`d~0pLHit3qFv9hLEomR6F<3&G-~Zvoz_3lEI-5%7G8|& zeVsiVI7v0cXK{k|IjF{UkZZ26eNQH;!yi;;G|I6(uJf9O^R@rRO1!w+@iEKnI7U4i zEb)T$aj3?t{rbHem`~c$Q_JEjZV~SlX3UG&tqaFUf7NM#;zXhu71os!U@{vpc?o08Tg4A{*l#T zp*IkzSw^7?U6agCLeg|t& z8S_P*qa|MSiY*M@EgGta&XnT>?Q>8q2yt!&VWY8*>hz!*(5OgUUt6dH?(mq0Eo4%j zAYAQU47MIBr>-tspA)ptK{f6!W-JW(!6noO{hI-eI$O!0wQXvayJ5a4FHZI?0a;yM zD|XM?a)S0bs1}3^SBpYG+XqUU9vy*3EooxVcH$me8;V6qyf~qjgkQH0DsN2^CupC8 zYP`?&#o-99^O~{H9cWZ4u4#zFJ+^dtkrFRNeJL1NH&iLzp%*7;pMz>a7l5ZtOO1#LsSqkc1!&=&I04HdlgKFHR;CM->SfQL!+I}F=sAJu* zCyc$K4}p;qFBa}E1-)7oH&z@nm=mK`8jG6daxC%I-Ds1RB+eVZNx*Brn?-DeX#UbwWW|qIS8z*R=gK8Z8NWv3!Uaw|n zUv~u>RS|bR?Y9N@Zo}L`Ui_F@6n4$J$p+z$BvjBo2i3TK@V}C9ao2w=UBnzh(i3v1 zWzce0U=E}hCGo;XDFRP+39z!yKb)X_4ypyg^Hy<~ROu5ly=@INszOCvKbVO7xJ`_b zc#*9X1jp_bp!J}JoS=OUss*9LqvDVlTneh9pi$GYH}O($lJB32l6X<)?l0EsRwEeW zXU7TJ=b#!#?oJkkcX{@Zl5Gbx>eCI(zz#IYWx7U7yr@$6GaK=xBb1H*#;Blu4yy5a zUb!&j{EH{Qwg1j&lrJon|`y1HzI7U z_>j@4137xF*fh)pd=)M6qFLJ)>{$KYu>7~i3EJnN8h2b&e>0~>-QYmWBaB8JG2mK& zu_n13?#0TB0XOclfcL|o#=tmE&^`y%n3;L{6FcBO5N17$Wi;w1&YvgZyz}19u@Wx= zw_Rox!zVzKNg^j`pMz@5FUfzwhS-k=uURgPM%~0Lq*Fa{za{K>@nXpR^Q_V*Z`j)6 zvPcE(b5M;v$T@e}qO%hqz3~T;M!hSc*S_KY439>~NxZ1)ew4lYIThv^nsb8oIjF`S zWabTaI)4(R*q0P(R6|_z;|G{q+hw`LivoT3GpAuQpiIPEBNepIK{cMKx8p1`^_T*O z_s1G()K#318s}`1eO%%tUUYZKV*77RhX-xzDOAut2i17Sp})pl_D_apGg>J$YECoE z%xq(lbu2;R#ZUK@EdG)Y9G{2x4TqY8_*_mJ#h;vY@7^o6;?Pj&Rdp$s{YkS;sm4<(D_>_Z zS);*h;B!*xr{zV9vcK7fCd1*)!}?rKD$Sau8f&-*&zOJxvCyDiO)gWG{%X8vGp-nP zRfa;*Vsni2b!jdy)!07||Hdj^8w~~BhHyE;^y=fqqSB?{?9IX8+xVaxeO;Q9Otm09 zlCkyLd<57#*L0&%^e*B>aK8%Ry$;WC+q+Gqg639JjVlfh7lRUahCuHtySSWfS{v}< zVNg{V^SnD0^K@hMb!m<`)i|l|Sr#t)^o5R%8JBxbYc*bceNhWml@+1Mu^3L!?0Bm2 zR4czqaDTH5ao(|9Mm(*Zd9nCuZ5Z_#&r5Be%?X<2Pc^nO4poP`J6z!IyG>kXKYhyZ zBD;qJEG*j`B1a$R1YNB_HMYVp)PVB)Tf^`R$GH^>^l8b9Sz1G|^Q;any1nHDU3Eb< z?!z*qE>zfC7dC%;%dNDaPkmmT3~2&|oQptDxfIaXrK?A%#(S`KeK_q{3No&g0vbhI zFT7}D*A%|Ye2z1IRXIV|v`~#Z*AHt1Ra<{zlXg|%*2>UU7%y5kYYtU|%&cO&dYquE zd8o#dPX;uGa@{Vnja3}D6+E;x$%`~RTXuzA8f*Tg1t;jLB&spvSJxDJpIpN#yl%;@ zM53)?UQDRi0)AKVWBo_9|*KWq@#%&PC=#qP?j zL0hz0oN%xQC+KN6ss*9KA}5G}L~%n47w$|P9c}RILOEuoZYh?$^T3V>PZ7qPN=U5#S6NtS?YF9&{N-33&OEW_2H_XsY$ihaVNd$tRpXq<7L z!o<@8#2+84eu_C~peZ^l&x?jH-m#qH-fD?wb*?*swmVRbZ6r%Ru;YPaRsSagxJC!M zy1;{AiFP;*CX_0*fs z3hfi2cdgOe+3;O-i#41rbW(NG9&&hnmYe2Li>=7ErQs- z$BXRe&7fu#XLaq;1Dv4E9aQ7rkAXH&JEx<%dpc?O~zUByPe{@g_=lLr%Wm*)eJ>8181WjBc@xpFS2l%P9RcF=f%L&@` zLA4-2g^sZJZ98>V*?J01eST|FE(4aK<)uY^~bV*3{=pr52|sj7UBXA zw>YUsFU~U1RP{%Z+Fe{x>=hOx@uKBG89Fa&p~n7RRzL;q`k)%`wR|K)|NQ1^#}n6F zXliIhJS&6!B|&FaNxZ1~0viP8H&kseM2S?;t`Dklm-puZ@cCYSwe^cTB29H~9i@Gk zVv^6*UM2BjUGWgG^Qoa;?_ZBmLAySv#+kd=A<*?sRn>Z4PexNi2SsTr?tvUTccsLO zTgOI%bOmHs z!76Q%g($tmi@bpG5P0^j;rxNuoSs)t+2bK!TP)@Td|)({ksGDGD8jvibM+E0gwZ}Q;Z!4bBKQ?2Xx9hT zxQAueXzFST-sZ6z8~?ZKC0>l|>jgUoMzL8nZgYY*cTkPH?i=|)OoL_Y&C~0QrY7Rf zfv1VM68ACj%=3bs&9Yf!Cymk6E} zc|Dws@)`rZ;2b;DVizaAlBN)<1>xq0bHd)(6jJ>|w8V>D_lLpqR^{Mc$Az4r zT_05Adtz62`0o0Pb?)HLXi9dC(y}JuImqQJC0;z=?goZ;wP5BwJ5JE952^)W?2%y* z^{onoow8*#)!PAk=-qMU$99#(3u&e+#0{wruRq-qsi0jSRAYBr*dRC-QU|=NeGzHO z9a}uUVZ+~mzIghKydJ*8_3Q%+huOfN*AbkcT_05AJoQ&sxZkb;w{`RsPU;2JUHJ5W_@x}XzFfMq-MZ|jr&d3NW3T)YY)wY&Twev>1`Y%*y%F;DbtJu^i|8iI>@uF|Frf~gUC)hMIgA=stgK8Yto@$Bh zmu+FZPnJScjmkx84eA=@D*e_;yr?V$sHGka3|6+^hDU6LgG2HFob9YQmcHtzbpHG?hurvjxW~(+ z&{P4o!*tz=9gREINW4&jyF=xPR_ey3`#3?z98}{?8`pY3r@{5qYQxhNnyTuB`z*6e za@N7s5-;lZk)fqS9raS&8cxtL2i16H)Vnu4`CyHE?t&DWdbTlA`?$>{C+EaSym(sL z4XT%^sj6oOa)ORIsK(!@3WH$t-dgG@tL6$#4L^;yd0_9y*4?WlUW9~paT4yy5Q?V6D=wQ^N8XK${7rV?L9YVmlA?q}}yCz{g#6*2oUax)OLIoXjP>mh&TgO9T z*au~5xiFEY^4sAJ6}~3fW@fa+3w_5)aAfv9C8)lU6Lic$HO|lvodouGZYs@BmBCXZ z|2Go)XCU4Tgf|6OzN(jaabUnSupg=^UdgtcpkofI@$P{-(_lzlgOVN27)|w`7^S84 zG|8Dm^b#*7gw2F^eyK`5X)Gt`n1gEEXIXzH+$x)(WMg|aO|8K;l69?d#PUEV@j}Hu zfZl~ml&qcMoS{B`6O~yD>3qo7# zxiBsAq@i-T3`SEK>##55Ew))X=p>?fI_97nyS%s0g*mx<3PRUs zGn#s~K1y4HqoUR}I*Awg0drx4jjvd9R~9Gen1gCuiQ6|9rY;&SuGD8TntHPaJ0MOQ z<;ISCh8 zS)Zb{oS{GU~2WuB|f{r<; z7KDRVv!UPKH7xhZJVsMBr{P^fIAYn;Qjhmk|KIE3v(J+05Y}ZE+fi!-C+L`iYJ4xj zT~0Zhv)JLNk&LFckH(*l!~0tB`$Z*{3OdH2S`f_CPDl|nkHl=Ux3}0$JV;4qO z#}ldjj7m^yAVt8mh5zvAGD1$A4w@ zgZY*l`d#D2%Me$nG3ga+GxaRji$i;OsKyf`#=f9l{>C;nI?HwM(4RhD6doK3!OdQ? zOIvnvg7yhfEePum41x<@pV$w>KCVNE{uc3~<3o4o=1{__1;lcK_99V@H zvC73;xh^F7ZorG+2yf_H>H#})X$B`6<1EhqTA-*Fgwy!mz6oc8E5uCWI-R(8HSYcD zQr}6CQvC|+;MkHAw5N*G!kZowq2sKFtXYr^*G)y=oq3_{oC=E?o@0Y|zBJH}OZ&E{ z#`e7#lObc-RW@dFDXwFS{*~cHwZ=1H;E!WWbIv!=k4t;QsK&b*gYkaDcjs8+y=exT zqJJ%UF;De}fVFw7Fz|W-6|~KaYC(uyF&p9!9cCp7sRcAe|LXH1WYGf18McMpo_WKC z3fkjFHSPn*p9c{&QrVi!N+M0srx#vK_YZ(s#z+<%xSSK?JpZq?j%q=8Id~x~d$5{S ztG7&~Df$$~i-Y49!HwUOS;vq2IYE2%sK!xh>p*DeAIQSXoEB+{K27rCS(nA|Pfurd zw%!j;(0)Lwv7dT!5JX*ZVW%z1F`A-J#k{ciuox2NRAK#&TXKT-98!&^wo(>DM(H|i zbeWorrs#Np7X>?lA-wf@(RyV=PSEy6s&U^^|6u6(I!fWiwN4>myTM63 z(8_@mw0Dwf?8T`b0=?C);;Y9_jHc*lix+*ng}__C)dep{wBZD8!=xJbQ}+vjT18t6 zO8#|XG(|^^y!dl07`%@p8fLz*;{q#8$FkAvY&*(^hq)i#W#=;)UhuG(S_Q03yh{hXlvvQ%S7{H*|ZYZ0cL{;*P{DLSjdi^)|N!1ya$ zl{+=MbAq|D;MQ6EqQU2Tv2)=Yuxo|3k6STLOYJ9)CIUO==Pb(LL6$4Gt**ac~Ydskb zq+C;0-xj!bW7@w=HJ+S&=Lb2RuPKWb*>Ii9bk>mm^3u_bM( zH?tpH?DK$lx7Ui}sBliuK5VK5p<$QN;Pv>KB0t^8bzsw3U|tAq zhQh#qJ}RScZ|4N<^`;uXj=h5+<;ZKrrp95e%bU(-^TNZ>54?guD~AHla)P#vQ!NOO zo%+I*xo?%}qi=GZf2G)r`L56uU0vYC zbG}FO{F5&#!maILBCX!nH$$ z_V&Ch>H)e7>89x3|q4OE(dY40RI zD*D{G1H`7Kv%w>5Iq|m)pkS7|D#QH0j!T9I5Q-dqR^yF!!ALzE!R zUZvgqz7ry}ldnv&G;y8uSO4?O^qZ3<0Y zYK6BV>P@m~Zj{7}$|vT+HleAaYq^mVv~{0qK^TZP#D;HdtbDwqQ)p^%pD3*a`z#M8 zMoPTcU1}lpTwX<~b8H1CXzM=Jc+P8n00>Xg{I=Yuqg!Z9w`4fLgGbcULb7t zdTA&#YceNj>ps=^{W!A-Ml^kFD7Z3Gp{c+7a@zGV$));6NW8duA_(gAK4Q2&#f=lR zb)Rb7_qt&*w79aFeE+=FvP2E6q*_n9i{!OfqQEghD*Fy+cN~ZSEy%LKFWa;v~{0q+yl8Z1ge&) zVyIWYg+fz}ai3-JC!_pc4wraw|40Z_x>l(m_qh!xXzM=J_*bnk1g?Mjb~Nf_GliyR z<4RopTi8k7HC*Ba+ZO_E%61pesWzOTt@~8t>|jC&#J=6^;!@mPp{Zebr(O-!D9;!X zF7cv|QwTVO4-}>1R-B-%`&8rJk8&YkD(E1#Z_!4fDHT_+I;0!r^Bck?UKGy@hO-}a zqD5i{PSDnUss*7y7Yx6f28w<*9Tl4T78a%1V_#qM+;E8(w~jA{B|G!Qt|z*4g0}8c zEeP>AKJUCdR($_mQfNvGz&)vWJJ*xC5fU%@2thFA@>B6{`=Okmt@~8tUYswBph`-S zxE4GVntI_ErG;Swf2Zvc5-&z~34|u)%dor|Q#ip$XFt_=2WUbd9DMjfoE|?#p{e`W z-R6dE3k7c@BwoCqy%56Otyqyq5GQEsKGnGYDs3TT2A5&CM=w)o%2CEfhXF>}lpiVa z;@>9o;GKmNvmCgZ6SQ@oYTOsTdLGO^Y{hPSuTy9$s0Hr1>tK|>>Z2rHyl5~Re8w|& z*)f$9v~{0q+{;-w8|oI>vFHBj3QdhE9i{cfRhdr9b&{E=Hv^WPk=WyRyE#Ey_o>EJ zvKcc$3GT$+JLW4iRe(1MY{fqPPWyEdFUq)2g~qu<*q2@foS?1yRO1{n?#oC>?aFj3 z4GK+l!x`cCmGBmf^LmLF@!1n0_w^XoBK9&TXzM=Jc<%11FWg@*vn8djC^YpbDN+l^ zcKjbdq9tCu8#fL@-uSTngI;igw(e7n^Kg5-V4u}Mwx!Gqg{DSLi_}KFE|Mc$R!O{Y zoWHcxKp;}a5$bj zk-48NuTnu<_o>ERNLxpMvF%V+!@ImnQ|qcmYSR58S#Gmh;>ENUuFyd7VM_{Ya)Nf~ zQ!NN-F$1B6Jd_nnHC3AWbRt4iuNTSv6V^z)_>?Na@3x-Iet2U}&`}E2c;@G8FKFFk z5KBDKNTsRL^CPr>|0$BY*2dO4@_K?W-=`Z`9UR8GY;DB}I>w6+>m^>~bn%4e^<%}0i_5C?r{QrBjwbFF$*_B+)EL_rf8cjBXJNF2 z`>*c8>lqZt}sF?IaMTgnzcsaMd#)+oUOb?oSN926ZHE`wIIwsEJN3nDDk9CbCst4 z{_n`+Me_15Yb9O`PV51nTCEXxKxjk;rXbP2r=aO5_NoXxZytT)3#n}l0QC(l_pQd)*-xQEHyb!5}QY9{qetdtQCtt ziQhb{!I{i0tnh4Ks1p>S4S7{0zv!MQ{asg`@}@|h*f~l185p4*$5{$lN<`7z>jirs z)d>7w+Jf6oym_y-QEpK>K{{UrZ?Cg9%C-*^q=ForbHKg4%Nr)3SeF;aM&0v-D-W-; z4W;mQ@peXeUW;v#!7oyKi+?$XJ=-SL`x>F`#NF6a$8AHgHsh+eI4>ABysO6sPr}>e zumvdQ(N^gr{{8rSyW{DNu~MOXq;^%r_N>l-zmDk+v&AL8OQB>}U6G1E(<8OEs6&qP z8h12qswzHMz7)gW_D5;Qnm^|NGy2LGV^xUpH~# z`lZnE;cFKv=x0SW{*+|T79UMq3eK z*FiPji@c&8o84&vSRPu;p7x5=I=bNfj5)E=3cS~{0`|Rr8XqU!X@S38*mCq|cpQEm zBU+YbS(}65=o|}9(0@^?@#iY5FKf|x0W9k~oh@mGO{aMK<*=Fj$CdEk>J{#Qx!LOP zckoZZAvV4D0GOf^An9?0)(LmPH@Lh_TG|`;m*5_j@k#O0+Vc_GD?B-CH7Fj%z;kJ= zIL{OGS1&Ot=uZaKI4Vjz#{Mlo0LGpC!D`@bFguzU<)V4~$E}F_p7+>bBW?e`KZ#DM zf7rIpW$_-+_K+7Fp>3^*XFirDNL@eUy)u=J^0g_6(t(%=?J3^iQ}^Uwk>~J^*=%eC zF2|d3g8qb4jU5o3O2byWvan^cGlWM)XcO^S+P=5;-jh zS3+yUopOO<-OodSrs!u#Ur!L~Y-j}&?<^7Hgq~37AE^yET_nG}og&fCbm$Wn-YwxxiIxRrQ=WG_6SV2tJ7 z?eKRn-%@PYdkMVKKQhqNOWbYPOUB#MHpiKXg{@?9!1YiFy!x3F9XI2?SA30ecVi{0 z1)*b=jpB^p5a`#Wu0m7gpWyf$chGIxw9QPk^qb&vd2BG0-YRh-4Eqx=_A$z5&c;bp z3qree8}ZQFAdnA^QE2Kv#@c4R8oUX3Z+PmTz#W&kHjiYThFY$mH02kIoC^SVs zclvs`r)YGlOE>(ielJN?TzBfU+Sn0($SPiI5DZ>}#T$1gLBB`$6`HzqU8kja;C*+w3Eb=9y_O%s#96z2q2{h)PWU#}YdY*5 ztkX0>q8i5rH}b`MeZAprr|$|)y>!%TPbT2~2KY|I3y)uRP_Su(SlP8FgdK>~Vs017 zt#+qM^!JYc{c!PY123vaiQlkii;7sB-z~&?U zwfLNPaIU!+@wEfoj$R?oAK8f$;ds;E>k=GC#imPCW2<~>CzxixMZ7XuS72-6n)|~LdxxO`@isZnO42f#I!Tui+cE8^u`W|oqnpzecrS*JL zB*(dCnu!isy&!1MGVxSs3r;Y+gJ*A9ywlq*OQITAUkCJoLB}_VXR6x(O?CS>N;~-h zN2zJ%!c8f0(OP-K>EFMUHPiK)HV*I0yqO@;?>YThz`f3UR)_-}N5kp@3zZ6wbiMZ7 z7k_r=C2|_)ck@ETr;P?dzj1X{n%X&0uT7u!x9dL1Oq^Y_LF};56?SiGz=_)VdTlwL z&RiXnC{c~iiC%}rR()j%eP*lDlzWO^`#s+%zsgQB6AR`w7V9_Z1A!K{YWBZ+&1W{= zYv`CHQ9(Zv&hLJX7q^%125DE?a$;=5Xw5muD2Ez(jk7pyBE>mxo!~|(7nP+$ZI9p+-mvh8Ba>$L!04B>?3>}ajx zTBGb>OqQq?gsk^##pojyp?&UXm8Lc}kJg%QHp)Aiq?n1$RVRxcrEB0G#Sv=7dC}Uy zbw>Ht)nthZ`jPPG>TtfeY~MGQG{c({B^#o(!AaPW(l>?ExPtX!jreWCQ?|q2Po=4u zy`!~&G#o)JGZ!}J^TnnYOze22>6~!RjMj#2$GN`n6p3n_{g{&^Dwao?Yv3%Ere1qS zYu9$-DeOXXQL0C@cxy%>6I;$uZ{|j8Gw^i9n5`)i74#zs!pE<>#a&VyyI?h+6Vuda zZPZchV!gv_LAW(HR_rrAhD~x?sM6G^S<%`**fw3cbSn3H_!@0?i=&3SGT(1OoG3gU ztw|@1veTCoiE2TpIW=1xx4%2fyS!MXsnJ2vT930v`9-T#Gtr<&yqK2UpVjHNSamoX zt(`LAU;Rp{5*73#VIRQ1dE&Z72C>_>P)_`~6svCg&<6!gmB-g8 z_sl4ZUCqVHSvg|Lxse6Ut(U5;@Z;{n)X0XZ5*73#;cV21RB`{$_l9{BLOBs-jMn;n z!;{4Vukm}X?GitZe`FZ7C{(4X>jBZ)$}jl$qp7)=vnEbVelcG8{AUp-+7(7?Cx76% zqOU0u)q?QkQ;O)-W|%UjC`hF#%jwaYHJ%Jxi$5j2P?L6vVGDc}&*Vkw`=ilXVFm2a zznCIXK|d1CMn$g`*WXW7I#-y-iQV`+c-YD$>mqrLr^(M4#AB~wmC?d{m8RU?qqW~P zP4cBf=Ay@=4dUkbQ%bP^3{E`k5v_$bHOb2-r$|)eD!}AjVp;F&imt;H^e{79RM6MPexD`lM0of{Nt-=^6a6EjwF@mx^6t94#&dTRi)+G#$r9Cq(4oa%aod5PN_v==N>eXuM{A=| zTzP9QnjhIA&VNu|T@dD>`b>z{rr;fS50a84D(FYTd&4VwivKpNr~2%1C z{lX-PYFvYSm@dY(uv2r-^;Bu<#bLeHq@PLd_R?Hb`!WFTCeIdk$2R1iuO_^T(vtA0 zFaA`PM4z>=w>Gjr)U}8Z&-8B0iPX|MtuvlVc~?4Hq8i_KKe|G&&nj`7MFXIzQFV2i zCg50Yy}3AVH3$MO28grg)aAsbu6W0xtx?Xm*e+3xV`rP8@b$D#jJB)|G<9W|P7A7K zlxyrY7oL@d!?xJz;=Tk+PCS^R(~Q_WJ^tHviE2S;Uw;(LSrjau|4{{K>TQ@#o6!oN z019%1Emv3O#7?}o?>&wOduHWGR11RTWe+$Q<1N~54Z zm*kp>i}T08jv=n%;AQ1G(Jn`)-SEO2(|vL!s&O99ejLnl?I$KxEDbcZ+k`in4L8as z-FBFXf<5EFqkcQFThCIQ*mX*$*<*jn?eDn~)q=3h!UwhwYAG&U_?^*I)e@by3eWb< z{<*_U+;{hZ^9SpQ4Of2SMAMr(tvDK+(r4_DsK%ef>JwnFcUduR&Id+Qmww{yj$uZ5 zbV#0=(Dj`Fx8a#frIYVDQQ?_RTa8akgH1ams&NFFH4(b)Jngc2FP`WiDPvW=Rtj5g zMi=Lq39B0up+<0m%f!08nDRlVmBr_h^A+ZajnCBG{lLocMURnBiy2KlYNXd@Ud5-r z!TDyQem_4*UB2tc!=tcc>3!MSd!1dHWlqDf#0nCa(Z=zOF)(9}jRomLCmDXrg{i^9u8 z08Vc*v>sHO6ZSZtSS1(#by>DVHSVTD@wM_8!-~7Lfu^>#&}k!&;?B&==3@1NBr(FW zo%-T@7j>TytrfUo?_6M#M4wCO^9nZC$N7m@Yjjhm4|3*2yN`O!Ziq>qH=NgalJ!rv zxVk|HwRmSIm8P2F3`^7ilYIP)xv<)9E5@vr)N4KLIFYkguiYGj`>Ep-C93h=r{XEG zm1|G+PCGknJ^8veaUh0DuKNOl0@98uJ@1pB_#9V|= zUncHr@2lFV&y-8}m&_G^w{xo`NL0{|gzHh6<;AT>r>OPc+~9=z7;o;KgQKF=@tnr} zS4Y#tTBj$gwJzRNXev2Zr;WkaYu%fFJ=|GyXrIgTp|e$=%p;sg2+?Ur7n)@EtZfq2 z*b(oYC)$_HQJas-Q)udUf1ReAXOeTK#+!-4nu#uRY6hs@w^wmOKS!ta$F|TetF}p0 zV}D|Fe=&R90=4_9%?eHJ#2b$KEW-QfBhAHGWgtwex5n@u8^-DH;23;vA7#Rk7e2Ss z-$y~%YB2!1H(X(OpVf#Hqj2uEKmOL*waSvH#_#z8S17QYX4vruZyF~lH=KLza@Hgl zDRK2`1wi8T@pTj$tv;_n%?*+y*A5i%vJ@%HS<-f*hJe8W`_Tc9bAq$uskEt6cu z&s?+$XAtha#n9lrJtr)1U*C<3_&eA?L!w#`1}y{_{cD+FnUg)x)Ck;-+v5?A)soD` z+v8oKC_3ISwy`rO#$uyG+dC$?$)_}lYW%Go-whNw)X?ZgTcD|@)=^qGo*o#|Io(W% zan3Mxz*fVVFlCFv<9njfTr{>A zDxTXKq*h+nWxcgsN*B|29w|<8Iu1e2ux6`CT1?uzB5L7bn9K zwRCKefu`tw5Bhp|a`MM<@mX>x92!{2?KPll|8!4)AZ*<5o*%LogRUY{ zjW^iud?scLUjo}cT{ucpzdJ{1wzvlQb<#F&r-C5t^Ri%}iJ@SMJyJjgU5TR_d$yBG zGq>>}V0ZPNfu?5d#~s)>f-Lfjmw4eGUy-dS9|E%zpK*e&{823kfiBi8^-2(|Thg3c zA6$GtN(;pm#Rx;Z#0&pF4cPR6AV_}MiW78wkZN27m|?{-1}uc<8-ux3%Zt5r+M8iU zS>2W(@#4Lk0~^+CK1{d}#RXC$z1NnVelrvF$95_-bs{M3+0t3A$E9HO{a&ITzepX{n&~+TD1>su4U{-2;XXtI|q|(%% zwR-K-3Y=j%pDgjB{#PHit6y7)`q7RPbR~vrK}i1O!D99{hf*V5RGQkmPp{otg-8lnQnreDeuXT&XrrS*^5-%Daoy$BL zmIZs`a8A&56{_*?M^8T%T>O#c&mW`GRM{_j%^}k$FL|CK@#1^LLRPxdb@r;lcuvqY z7OHVa{MzZvsd6DJv(QhaDVr+MS{>}zdT5s_@gnO;5PM%UojHt{&I!6oLN)Hd-Y}aT zpRk23cATZs)XYZF+9K5`-|$S8cu`?uFpDvaW}kY@;{;tXp;{2KOXjibb^5VM+vlq^ zwYL?n51zwS%aBxw7Zd(0W-F?j#HarTaDuLRP>rj7I|G<)>7(NDv4JX0U2h$&ox?Sj zmn%~xUi7FM#5{WV79#0k3oLA4<4Hw3Y|>hOXEut=q;hWHxmOYro7K2_qy)*%a7 z^<$-!z!?FYpz9G-<5;ah2rJ#=y`gIF0F|c3w2apLJ{#pl3sWUt=)s>YoaV0>L*{aV zu4Ygz2rD6!88%E%dd19DX=-eJTv04zlC@!}5-^p0xE`HQnrKvj$^x82QM-ySm5-+;8=*^sTPFQj#Jsc{raobSJYN% zN_5t1y>aGl)5Ro-7xoXDvmt_~dfxw!LIoX@Q;mP4ti0Kjx1-g~n|>%Xbq1eH=Hp!7 zOnffkMXd>S*};aB)rJ)=bApb~sm8Utox|C#gMR9?`DYcHdX}!!cKey+>p_VUFCKf; zW@jR1s}GmvaDtAosTPFNoqI9nHB&8JDp#SYJqvW&p=l=hcf~}B7jL?hVWmbdPy;{e zIYCF*R0~3-w!qFL%~#)RK?+Sxu+nMA=9=WG9TOy8#14HW8eA8v>qmCr1Rd839W1>H|iHSTp@T9cjV9IC$FQ$?hyM%QqE zJI5cx(lA}Z>Ia6u`%m$E_+ zM2TvAlG&`Vwa2Hxu9d?WO^xmnrIp8(xFP?Ti*coltlsL$aPm9jghvG4CoE$J-NZzR zYP@d(Z|<#fVlvGCQ=idP4?K(PhWr25J13cm_%%0}JYf>N9bJhNpB~`}X*b+o)GJA% z8vCzm-()s6Q^4caI+3QdgHc)$cHKwSO*Rt~PCRGFhWJ7qxeh0MI_b1>qmAd6w- z*l6A71zRTh!pyjm0-EYvL8pb_=&sibb1@+ACtFqC8z%3JFi`O+RHt>FXq30({wu0+ zKlRO@?2`33xan0+p{dVqI?WB&IX`8mn2Etw zno%!7KAyC zYC&3^uCT6pkwQ~_Z|Jmq+@)8cb()#Tt6UEbENBC<&2DgFa$CJN5O3P3my{||jeF03 z*M+e0b`Tl&N};KZpLLoauGf06NHY`vENKjT9UH>qw!b)Wa)@4ghvTU2pHn5OvBjfT zBUpE+HdNeKQKhNLb@W>F7CcjZGtErYwzY*FlgfdwrzIzb;=K3|97nxpX%f}Avp=#K zWcUBcj!&(p(o}96y=IwVls`93HxtX}w}i`UZ!yQGO*vs1s@HDgILdEcnnX3uuvBRQ z%E@!gH=w0TQ!zdDn)hzp&oCn0Oe|_^5055iu_14qI5B6HUb8-Cl$H22iE2Suptpn0 z&*Rzp56&u0wZ(tksyOm;4^1}{sqY-%2%hJh=i8YR3peYv%{Y$IA4-#`#^U-od#Jc- zFpJ*NRi&u{58RWA`{9zdrke@f0Y^}?FNi)?E}XE~rq`a~I7&Q~CQ*&^aDN;iy^AJ( z`{bh1RDGP8P*GTAq?-x%Esk)##f*aM??g^ah|_C+IF9l^ktR_s2oLr;!V7g=L6e)J zN>f4O^xAe5!_v~tM4sLOHf<`WB>w2Z3Ga=1?Jc$xsC&{Rss&-*2}ihJ?YrS%j~*&b z9e3AjnK<%#yFT4a>^;~DjJ|ej{z5_};(DfD27I;p~emW({$M-Z4$08qXq!*}=yXx0FhUny57O z)K0GzH#W&fs-~NXEvuTry@*ok0lgI`GJWvh3dQwiX%f|VCsNDi5bf|;soS8QN>dTd z_1Y=i57)MAx|wjQ-w4*!udWs;)i|-QmtI@yXp(zgPL-&}cH?4ONc5|yPTyWtrKv9! z^;&~AcrV$3G&2!?$Qs`5X|C36@>QYYd=tI)rHe^!jN@~v1tDQ~6S#7{k=pF#CxxaC z7VES+J#gLGBh5?{=q+K#k}m4=Bj-60j_=f!d*g~?`BaH&LGVng4==Ku)gbJ9rKwTJ zblP6rM^^C6Tx2Y(4!e6w>XxDToY?dd=U#Cf)%+#yttA?FlGm#P6-v6RzkVE0XzKa_ zoi^3gBsaT&duutNRkDDQ3tiRi_qK4N(qWwzgLf!g^u?W-MB`4tR<*#nTyOP+VS_?b z>mzj9Q+IrN?SnHcoLD=h6bO6VRg3*YI8kwlPCMmglJDSi3DwwB^szGhj2o(UcI%_i zl*J&OwriqEZnZtdOaxwe&qi(cQM>-UYoOw7cb(R0Dy|7PPL`+^gqu!fq1C-Hs?Dtv z2AbMbMW^kVWs>)NGZ+6{FJ^9bemFwCQb5JyYC5gdY?C}~XOcvX``(!*-V6O$1|^Qrl|J?N0EwFhoZC~+?VkYPXJPlD<*SavB$k8s#hX{ zMVgw59VvHl#4-nGwt2C?;c0dzXqvisNM%OFzR^+IW<2S8_e+9AwIIB=xy>BU`>HKY zHe)pP-5F1YMVjP9EzwNue7cW$2TWDn$4ur#?N`_!fFi46f<(0-G`Lg5Zta_>dhT4p zXv)Wk?cXsbd5XzgYGm9Hn+EN;`^#dEh*Y0zv&S#QH>{Zm4mERm+`7=#|%bO z%8W?OZ9T4%eKHq*{?C||pAC3jY6A4cGCjjd&vpvJ&tn2)TxtfRN~}21R2Qi|Y-E(% zG)&^ok7DEErc$tAdMg;JRRfwDj^`DHe>IlywpK~I+ew2399-n>o zBuiA|h()Ul?PKsx`VaRQO)V~kYuosh_xDaQ6HAUYhWdLQpkm@>PISdpzZ6DO1ONW)+8O1z*{NotWr_n_R~_J2a1JNl7er~R0Z&@Qr%F@{ zLfKF!m{z3?Ebp+9(bTL|Jm-a<)rF~PW@2dl&akduD>!pv2`75|!PPz-L1xTJlc>g% zNJ3W#0td*=7{X{u#FLXhaO`~6E!|9H&js)w)g0_+wC2PSd!4q)9Y+)2(daj^8{St2x?cNL1tcxnVf4 z4wi6c^!Wms>W{mMM^3|2ruLa;V#Z1jus>S?GQ0a3s7OuHY5SHK5WsDdqzw4&n|v9gglC|ILu7#+@}OKF~Gz zCA;9zNTI3RWS!O~67RGqonQNb zp~V)3rk-EZY0nQB<-S+4%*4oUb70HyHf+?dBu;euiE|kyqwJ+-N>t-bG#6&W^+qjN zn|J97O+CJ^)A|(|<;h>N%tUdRKU~dC7v}}$aKb~toy$0miawVqQ7s5VC4cBRaGQ94 z(GG>Ce&hbDxi|6DcZF;-G3tmvI5rUrlIrGjLj9xD9^?6+$TOJ|)z~(D+8^F_XkXxW zBTu2JN%$HUpW~fK<+9C0)Xh1N;(WzW`%MlfJig=4)i=Ba<4~qVHJ+~V^M`$v3Jqzu zvK5*tk9*bRpLkCAZI+qX^mP`frrt{T8Y!Gm-|Doh6;1N9EtwM4I8R+?4qQCiRjE=w zQK6|I{Ao|9f@@x;EHg2r{0umEC`RcrXdNfs<4n=my0}+uQl>;TcBI^%32|K_6ywAg zg{BH{*L^syM=e^HWhNqCO@?(52bG@f131zAyiUu)oy%d(G9{`7;p*yXu;IWCrGCmR zg{I2w(P>R^#Nyf~%S<%9XN&XAyJL9QT~2l0oRmKa%+XA zer&{d(ViyR@mi*t=snvLmUxs_2Urvvs7PLiJC|{c<1#Wsq8exJj(WqBtk24erq>KK zRk%>6O&V&FfB9sZiRYh&gDJg+>bAp<6aF)G+Qw0Md)@VPiE2R@^LR8|A7-K6m{Gw% zQ>LLhEfDuppS+r3CZ3)c3^7lv)X-)jE>r~j>afe~8IztY$46D^l^OqfT2q8Sf@gtLr(Dg{R`X<7mRIO{zq-AgIQ6P^YQAy7BcoMpM(4 zMrkwgN&ozNbMfPr4fv-ztJ2wBoH&3tXVqSZV`rBXiE8{?Yhe$2huN!}Yz{D*YKo(x zs02I>_|{x_G_;0G58A39KHuO(&$p4<&^Vlp>Xs}~EeMawHG=UkTdA>~?=hNMa6MAH zoryb4@0p91V=IGOr`D?9<6oROfuo|UDJFRZ?x&_&5bjpC1pU00s_W)bKvU1LE6gJw ze@YZ{vG|<;y9-;XStZptk zH8Yso+3rA7*8L*22iUd{{@z@yyVe3uzDZ$WGum-tk|9zH{8=P##q+gP3qsv-c3^ci zhZWpw4K#HGcbE=;StS26$y|JF+XnXPve>mdcAPNaongh;G$i0&9IEkd*>=w0*(`_U zTDJh2(r!m;IoQfIy2M-zeA)>f=4Ue4+k_J)Y`+*%$tdsNohDI@>mTL1!m$hatZDfM zKvNewMrmKa70I33r<;j`2|c0V_$*d+65dlqK5ihc-R-l&y-}CbC91L0$y$aeLq1!1 zrwY(iCibK*EpL>wr)QW6P+h@lWd;k}RF)G}jCfC63#0tuVTMGtAgozA2#!3;W&gDQ z$!KaG3aJi`?$&0SiQHx*px5hE#>T$kMEu7nZL2em4e&{ZYTTuFcN7fmlfk-Zj~Pv+ ze~!}nVT09Sk1R8xpYI8lP2!oTyTOUNEpb$Yc^Cg#?f2=`B{XPq1rPF%ykgY}0S<;zal64f{lhtDMr2R5*qr*|@%I^eF; z&h*BWpN8Ab#OkqA;cgops}Gr+STy{n+C1LEbJ=jVD>vIq+bgKU>o|g3;6%Jc(2j zN03*?i7ni_^(Kan`* z)E?!S3BS+)SUqo9GMZX;3(vmdO5CFJ zxn|H06P>5%C%uHXi4i ziO{DZP%75bP`h6pPTV-F)5ha^)Q!*_iE7+|eIW$GPxm)$wXer$Y9X#WKgaHb`X_SD zM1VdRR`xI%Y7A<|iHDj_bH*lwHv@Adss&-xvS6t8?vP<$Z#za)7Wf@J+Q1}x>T}J+ zm?1$BZc$U&DRkmQ$X=bc)&bAT{Mjy1jm@f)g5X)}a>~^kE{vvL8gyEN_9l5uyIeEj zTsHt>BvEl~JB$S#oyRqnA-VV+B(En3 zO?u+g-P>u(LUA!C^viUbFP?BKUunBUwIEnMo(q!(j#3(pUCwA~gAPwl;)vy-b&i=> z_ihG^>Jq6e3S7^LcRo5T7e^Ci=VeP&V;|YunP9bNfl}$`n%aWns55$#ToRaVCZ1m( z2R&U=m1jmHC#(cKk&EMxu%b+fYHVAG@`gh;o0MM5&oY`?gZ&K6w_&5l>MS$y&x(;C zIOQlKyFTSaLww43gHQV6qYQ~^e9~X&4qAr<Y|U5P zwaT2xoe-r(?lj5$UDGA1@tNAbFX-1~Dkh7{KvPEC6?R!Q$(Gm5g-cowu;{m2Sz26& z6F+L;3f2*myaCspsm7Vqhay~$%uurDSOHC0RKc@kXKFC;lN1k(JhngUn<2+7-}_uJeHv>bn4EDW8WjR zkrzzzjFcpaYHWM^*$@JICMtidanwyx!{0?{yYJy@_;Yg+)VrD3CuFIbIC-G>U!yJV zN&MSr`?sss1^@TorrV0xfcp(c_ocA`R}hMiG!|bhUaG#UK18G`dX|hAn>_Y8sA|7!*Qj;X&r!ZbxS_8~ugC@#qjR(l?-^I!Au|HR*O zaE>cX|FsQMEeMMn8^kqTmZ%9gH;FVwcYpHY!o`ZLRAjLF#8{S5@wdJAY#6RPV|y>v zcpKEju54fD1?suvh5t47{x9{n*Y{GC>AzlIUKG2uXJJDEp<|%T=!rbq(#y93|6u*u zy9$ADy;%oN(35ji_Yv;Q1PPQQJPwd?{J&?U@LTIJQGJ=51)6PC$o_=gJAdG2?bQplXFz# z?Gb?sSZ~KgU>`EgKvPwAM`=^~ON$O(FKj%s{Dw$m}M8?&LM`yz#=`cBnp z*0^?O-z`bv#kL8X*oHgPAtExG6ZGU9)%fg_x}KdBCPAD1I~AJhw-3J#Tv5F6AxYvz zPFy_OS9Sta9eR`#^yD1Xg3xJ30vq1U6M8(pq0rPUT)}!Z(ih-ho#*jyki~DX7J*g5y#98`@r;_7M!3b=cvYA zdda!$$fh1}BFd*IapzAS9a33_slYJ9RByO-_8 zJMRXyu~+|JS$7>)Rr>u8f7|F7h#eSM*oqh^=U!}&ilTzp?byZG-9cJo1BwbLB8q`J zCTDLwV}UVtcMi6WozG&<_jCQ;Yo7n+a@LE(0oK`j-}k!L!l?Em`85`$S?gVi)1??y z!KQkDEXz~6>j;4-=TLJ8v(J0g+=fLd@Q9a*QOlM@*ypTDv#zNZuS;?Drd_?t>O{VO z>O$bjIn=xw)ySsY-+fm*Dz`E*YRgvc8j+Z0ojNOCm!f&tF?B8LZROjfoe+3(4mF<* ze|cENrk_!hYjiR(D&jDAjo8I!;`YYtQuO_pro7^kRJY+hgus(?sJVi!;89hu?;7Ql z-rK~ev~%2Zf}e!nKaAI1cybOkPgtdN^<=u;68~(diBalag#9J&j7B=I z*QLld@uYeXGdy*}gJDA8$vM=THk{viySY75<1P#{F>2A>2zyViFipt6UYDZQ_%!97 zoYQ#!Vu%oUat<~3PKY_BMnrzK`7In`VpQGheD;-VQa66%x^Q?s-VL98Obu-@+4yC3 ze%+TgL54 z0VYP3-xy&Z!8NI=!?_j*UQg2okFcpP3$vMJE3^;-PtKv{-+BC>D*5myBhJ#w#He56 zBkc9LCUtz@cwLI03;s}(ZaSM^7Ahg|etDj@`(oI}lB{wJiWg=eHzcStXIhv!2ILU} zPtKv%v~3r5svM1dOt%>YOpMy?9$|0DQ~0))j?<+`PG6-OJ`FI3P5Eh{z>{;Rxidxi z-RfFYYjf?N-wcfE`!?L3#CyV_i(_>u))Zc%rswNz)*F3J2s}B5n(z8%Zc)VtbT_|V zIAvf|cfK#_+#}tZ?cF+Eir@-i%DehdbJW~;A@JlJYQEF=iC2fS3^G42Uu|GiQC{;Rxi-otQr*k`o7t|_Xal2)_=MYIhNWAtU0th7 zG4ffE>fdU-nYgBg5O{J9wWj@+W2ySEWQ_SGy^w)XCmw~_hww_#!klY$DH@gNsx~Z` zY}WZ@xeW!LoI}mM)s0X!a{mOgEP2>4%08Rd0H&l{jVfz&DfT_Es(cNnn&(Dt@kW6s z=TK`}g<})cphA<(TuXacFlu!nKIg?xdTA;~m*THMo@&gjDdzY3H-x}vC)E5t+WxAt zj+$r|k9JZRwT@Q}&II$h)Jdy#DQIq8HGaq>v&P&SLg2F+YVHr0=C4lu9BWoMG)Q4o z=A@ONaIS#hNh?yEe>OIClh2OIE>hkcB=H_apg}@49)O;Ri_X1V0=s5Fp-X9i>!rz({yBF?M z?n{!x0_&bpbBCratCZj4vF0An?4q6;|N5jzOg^mQQiIG7T6G(KU98_m&E1nO zZ&EkPjyA^@n`^@;%pxh~_Dfg$Q-+wg*5oo!U>!PY?o@bXk7~O=$efxtmw{3EX&^y2d;NvLdV18nt52q~ejj9>9Mn_P>EoxG6k**Ssu>ww%&q;Sg}{>psCl|d zi&JX*hn{AODQm^)0sM59V%YarDxtccSwA*i2s{yiTGN{3zou4f4KVZ9IwMX&;8jM7 zeDmHY^CX!&on8uoCp%E{$@{F2RGWz{%r)H}iqjl;wUnapxvxrJRNwsDKZ}W97f-05 z*0iVnpQx;xo0x6OWi>GhuliCv{E>yO?I~}j{!>HwF0^Ehb6GNzZ-=O?gm42h3x$m^QI3kxU!Bo?SyxeQjGeRi|$pvW90tnB?O+}Ld_jX3umPx&d-eV3mS`4 zTXgEyU?Fyt|j;z?eKddpXE>=o}zK zZ#Z{{n)hpMxhVDMRO8gX0C9>ApHieKcQp^~Y4O9R@9iiAo(x3IwI3sMlkIgb!_Tji zI1PwTTT(QS$wSrN^-ir_uZs|P!Vxv^*G|bp6|0U&J>uI%oNC0UMk!w0$xT}x9kE3F z@%beXhD;{ z>hI41;*=>q#Y<7=d`_CuYMp8o>L&!AoJGxZGj2PP`Nw8eE4_s{EsLuWQdBas)8j8^ z)!wc?Lf{Et)ckq1HYe?9c}Io6Z7fdx;;M=i2RUoIHPh(e;(9{hNoLfV_TzIlsv5*U z;bYas>1A9UlEQQRHx)L#7%gsJK?ppNjhd@*-88D^T#gpBDq&(2u5wAy@6Y#Y`;lrC z#Gi5~@MJk^UMc$WLAkisBcIzjO^m|TIw@-3c%~+KdehOhKg9WSJRy&oyO>XWse(&4 zqurL^8r`*+o(Gi_+QeohEH>5rN#eizb^qRUwO_dCQh=+#Qk;L4rqasvr#tn=3xRzUP;tK|c?Kg@RwyG<-k>GBR6dmKj)VT4Z z>1JSCA+W;=YE8S~8leW>4WjB(BScpf+_jS8uUeB;Q2pQN*2$$p;9OJGJS)EAcvZFj zP>RXeBBr0>98D=2#)qpTIft4Nh2#GfX^XgTDbGvA6OQuf?#ubLD#q+?-tKZqh|C@` z?YY)DbE+z8{-mxQrA~G4Yj*5lQy7IOC#5*^IZ=6U=x%1)az=>ES)C_Wa%Bxq_e9No z)wZN6C+}8fQi&h`PW1d=ROZ~zLTkAqh39@sapUJc747LyAEv)n*b4`zc*?1vMJ}II zyAHIav(xSifqiOFYuc*9r&O?8M|##MO<`2;4Wahy?rGM~4mxWyl$Fx%kp))6nW;nRAXW~Q;{r7gup&EsChN2 z_zQU%AJ^$pd>;5yEipO~6&xW1_NhV5E08la@;cm=?j7`0 z7!}Q3Xb15Q?~RODU5dx0^3dj09jS+Nej%_=4Qif7`#BGF&eEA&Q#V*J>g4S(`|4I{ z*5=3JbSVh%aS(f69hYX?(_gZ6EFy%DWj-c#Nq?7Xo$4_acXZ z0{hgU=GmFKD^bHM7CKW=85nhCMz}qScSiHZ^Ue>v9(QA3QiC=(^rXvK2MU3GYEWxh z+TI%U>(JVCe%1m5qnwhs+Hgvm)zfW*F2%Id9#mpsC7SV1j1btT1~u3FSnE;IZDna} zdWwNjmSfxtDJ0F>YU&1Ein#NQC{K^VG=9lpA+S#kYVJwy-H6WB$WMBgO9n=L;8S#c zmhlNUu3M5~SSdv{(!Q&vQICbdJ~gPhPNtNF0w%vvMHhT9FsdD&QQREImE`3TbSb<) z>U1OUtST0l)kJ}PYEX0SM=qTbDjZe$yq!#pn#a>slDOh`T&DzGilBncX?W~9)n!F~ zA+S#kYQFcmX{EGrD^;^?E+$58DivXOv!z+javhlz9#wtmM|yiT@?$X}uulzY?&DRi z1vSjtLUr#`(!{7c+*{4&-nFc@IYF1=W0{uZ`>b#3kJV*`z&9i=uulzY?&|37OVNFL8%JIhH8HA6i3s~Gu0wX6oS;ilw{=qr>ay7= z?^i$w>{El9r}hkMPSX-&jkbT~GchWA9`2xAINh4$m!L~gyN9AP>uwsu9%K~)`_!Q3 zb)S7r$$9TtBcn?e6QfSN=Xt_z>DEFsJXN1NH5Bozo_}~{C)$YGWdjopHI4VNx%kO ziozGG)3-gf%uVH&3xQo{Q1gBJ?0S?uuZnr~{9*&6p7NQ|$hO>X>Bf3pio|2?v|(XG zbL08JLSWY!)O`KOT8mnG)iryTn`B_rF|MZ`%{z)!4z1Uvn6KQZY9Alda=VET*rx_H zulwApMpgX1Ouru<21Zrq-U%zY%T3oh>vbvat}H>*C$=`zJP+DXV4oV)Jd-uijW(=k zW~T1jXv3(9d|&d7J9*yW`w}T0hC0*pHXY0&Pl6kxz&^QxQq)VZiafqiOFa}T-W zU9PCRWdqC!)y^x7n$$Mb{s-5$yTz~3rC9gufU?(XXO8>)LXX7K=My3J4zcOh6Jug@DPHV9r{>>lVw!*C5obm*3N@dQUhJ*T z6*W(ab$g;_b@nl%CVo&Dh3{61pIx)lw8s{6`tIvO;OSh{nUiR~sQcTSnFE?$5GQi+ zw%fUv!359P8Q=|pA;Qym7;6jK4t^=P$BTN zG-{qdIH3?d>FH}89Xvyvkj5;M;z`>IG;kQ1Sx$Kifv3Jvb63a5rRn{eW@hE8N}Tk@ zPXj4>e6LOsMVgp(y+2y;>*DEk)VzA$uOijo(w_Qszk;Xvcw|-~ z@Ju~wO&jG?ivq?qF}IG~=Z#VL=`2O$4n^U$s+m&`46&iW-TbtDrsO)Vg6Zw@Q3&jDfSPCIdMa8_zN#5J{)XtCfLBW?mX>QtjRQ-X-k}u? z{JPlP0d;0gkxsvEDQ{jcQ{BKQyy{EwakD=y8k)!S_Z%Yx_MAY?EA)k0(T~*y&HOhf zi(VFZ_aeo)q8;g0x!1<%T`@vnw++;Mhdd^Lb`SY(EQpR39X9YTOo~3II?;s%*9`CT zJB7fmA*gvpIJyIMZ2!pU5V}ot3c6tEn)ZBZH#$;vt?~QI>!NcD-rY-4hvz6B8R&2H zDW4$(cB4VfldY%rq`NbF81)`K6CG&qDMgCPwfoTE{HO{I zwyv{2h)z2Av?ayrv3;oWi{`0bM?MRI-GNYRTE?J0baSnL>aACwMMoffYLvq5Zf^>H zlWbX7<&zNDy7suZ6&FO{n>^y<~6l z^R=qS6`qL>P52Zq#oR1C=>5(4YEk2RLSWY^)La{t-h+J3EmI#~UlpCEa5X}TGT*yU z(?WYy%8ye*VD~K4d}4i4SBl(qNWHmmSai(7RTU}5Ug|*EI^I=hPVN!{yMUqAwDV0m zQjLL6)zKjvMCUJD9gY zMKTJ}r-J>3z#eO;`Ggy<$vh1!PCq|2F)#{O>!i3+swp+-;6{ISDibKuUs5Uyy z{-Y9=9(T!xQMl?T#SOa`-RxMKR&Ngz0(;(}=D*#AjVM>|x>Rd@a4JTn!Ro0L&A-&8 z!k-$_^8-`7QDC<})I9%#=iEgP^P;z&<1HA4tH4rt4{)b$yg+YnYYKr~3sG}LN{%YD ztB)crq=@KLh^yIB`1En5d)1oJ@vbBUc3(uTX(d0DqU7~DWn3I9Ixga>ycGSP6r=%P zo72IHi-f=~lBjuAZLKqn&fk=hA8r(#BXM^@iY#CA(4jL{>JyP71a`wj&G&FObJ59^ zrj&D@DLP={E{PO(YjaJJr5Po6Iw=Hp^+e76EJtcoysskVeP3Y|?)FI0EI30Q{6ti* z=X)WrJ1J^DyEOf8)uE9W4K0~NbR@-HD=Bh+yQCKF_M&WA^9s>sdx-r|VLpA9bJwAw{pLw(o*wY(WvKY+MtSN;keR-QP_0|UytWzB)nJAA+Dy) zwVV)JqeJXN_wp*|%r!b{P3!k63pHty-E2I+4q?=ug(3D*htjRZkNj7ZXsJ=p@lMnu zv=(6>*?8U=z4`rwwI=uY&D4*$*H5PA8pxWzQ0}L>$Z2S0A+TdBYOd1r&P&nx^3&Ru z1f90J(6f>S2&0CkhuXLQ zl4k8bH%^!0zDs$^yU3ZI9&i!@d%U97w9upql=i70b#%#27&YK!sJ(Upp8Woidu+k$ zXRrz_)nU2o>rchvySJav|=y-JsIaru_UVo-Aszr;;5 z&XnWi6(O+4D{B5r{HGzccPmUuVMi54o#iR67r0MR&ng>qDc+GzB^KqUCqq(%z#gxt z`F=OjN|RJUs@r^x!l>Nm!|bW`(yW!sCg@U(-R?&>BYz>w=LJGwk5|+@Z@Xn%+IasL z${0OSVbr>BVfItJ!&~b}f-XhLz8z@C@f`F|L^mO@$17^?zq_gvy?B#@d}r2G7ixU%dDSWOCr7=~` zs?yu%d85D{uc*0?aPHw$>sY#~-g8tcMuja7x6hoOW*uK~lP<;gEhA~+ww=nByQ&QZ z_IO3DY0LVLqVRReYU!wXHjG-vT~6lzo@Sl0V3RIIS=Vut;d+w;HCG{p zj-xjJEKqav-mziS%KhA7BR0+Y?lSi;f!E``)QE}XU9q2YyAGBA$?wB6NtfcY+hpqZ(%oq6T2Y9} z{9XO8Lo90Ua&u`i6>%B%DMcsVN_|Jg0P`Nx^>&}O}Z4*`j4T6HEWC~b4($y$17@H>#H`7HmzG` zSQl@#VN{uTo^Vt@-8yL0CS8i@&qmU5mmNlji6e!;9Fg+ zZ^@TC#LnoqNtdESSP=DiYd4Y$7Zc*^^8eQ%7B!!=$TpI!SN9l4J3LIqs9nL_U945Q z_0${gxeTwzci{~NQIq65#?-!UDj%)?w}a+W$m zV2@YSeEnG4mHr&5nK`mFQW*7Du5kN%o*vQZb%HL%ic5af{qOwd;v&<8z#gxtxwpDs z0A&fzWm-1QRv1;9?@MSwx^)=emq>9m+K2K46*6m{UM~dpcty=WE05;1s!3kc$1PD| z)T8BLJWrVWUp3yKOA*nVXL+?QY<8IZrx4iV6*c$MkMO2moeP+uz3d93VuHf#t#}8k z;3l4r1FxrPm9N&KuZrs>;%^IqJzi1s3AgZiRJ}?8vwa_a9)v!!MO?$|3-}4C-?DgJ z3isP?6rqZk-Fs&t6xibxHP0*_SB1t;$!}&YpN%l8J5Tz%xjWsOdsLh*#XmgDqQ`U> zbLqQ+LST6tRUUbZ3&gMIQ6!@%$nol(j%T9i! zvzyaT)FO-u4hylb<-Sq(pRCcP$mW%shE~04to-67`YmA;YTg-5DMl?STsH!<)fNIf zLZRk*>KldW$L;$@;FemV3lzRvDgM0RMs;u9HtM@p5CS_}q2|>nuD8qO{?w@0%uRH& z!rz({*H71?g%|D{w!MXgzz$ugxwdv{b@HwA%4lROB)W3pU!N4O!x~d!?T5xnw;V!X zr!myrrJ!mgY&?tW3rNXa^9n(?nwu>)~eqO2t0@Wz?TAS9B4?tEChR7Y(L0-Up5F z)xQdXoe@#<-D{13bT|2g(Y;1D(G3x=`ch2HH-h}bd457kcOkIDBWm7hC=^6zz5Xz! z$CVXb9r5l(isJLfQopFBMyyYU1-~wKszl8_gmR3bH$T@HShX z8bKoxg}{!RsJQ|n$9NjFa-q@W%?=Aj;oYPZ<7ZByHLrt=xf#JiVCPWOnpSbzMA|WL zrcq+aKnq6UU9l7w?Nh1!`vyj~;h(%wUDluq(cc|^Q-%9XvS1Xhsz{M{?s#h5d%hZdI#!4S z&}SR9rfqFGj)q?RU3nHgZ^0;B9gLw2o z0z0##*0g)C`_kgdX{tq&V9|{oR~@D3_jL zkjE;0j3%ZP;Htb7g?84Xg9~4(-hby70w*w_=9TT`b!o|xM`}aX$|UEr6rRdtDU<`i0KiyOCm+d!fq7AzmNBy%L;)LF;MgT+R$>O z*S@3XH?Jh7VBl_#6m91hrl<+`)xLtYg}})ksQLbCKp{%MaYcRZTu)5%z+EdTE;Y_g z6(3wxH(oXtqR8YBd%%km)@O~^{%6lCPhlsjZk$u|(k+Bhna^kazMlB^=?-6yYjN`D zrPz(=ql{+1nY*oiLH5LNrqoC#< z@oTG6qppE!@`Of&QFD17%fcHctnMlCx)k5v)usZKTdU+d9zx)J6x4iAJ-sgVYZ9Q+ z^VcPeioO|YKYsg!^+@COx)e*dH=rTkTdHYQY6yYzQBZ5z#qEvg;nB|O>sxois9>J7 z^78K!R_Evqx)gUy_>kMnR_fL4@$)r&if|Nj1jb>iO% zx)fEPwxm~Yd{y@)MTNlmD5$yb`PSAn8im_)SKxW{ywf1X-?pAKx|E0dCF~y|a6SrZO*?*|4}FcQ zuZHY+qA=?2;Bb3dgEZ@}pObVc4wdXjm5Wzaqg&k*0_UTk=KI|>1L)ZFit3Tq6@^jT z`K-)a-!!XF;$~fnoKptT^07r!(f8+s!1*Ys`QGQr5X#%KkV@@#Twzq*&EfW|z0#~% z`fSmq=)Y+gZ7Y#QMQ|TQ6gVFRHGfj?3nI(m&z4>r_bH6p!8<=y$Mad_FI#je#$+Es z9a>$s6iwYN1kOi6&7D<)N7An3bj!!-TNOr?yB2PLGLPrc4^P&mxI1qYb$3ayJZZIA z2%L|CnrFTwj;2-qt1PF&Hz$*dA#gqlYE5&m zGM17W`dPv&uT>Z|nCEk5=kuIroVMyxOxZM+@|`{FJ!fu=5I7$NHNTHnV`+RLn|J5? zs}x4LeG0d?zno?buC!H`VqlSRw7SR8gNyn~f%8#Nb7g=2ag=thZgMvwU{S^0G9xc$kx6!q?mq8uak z*uMHD3W4)cP-k|)97Sh5*V)cJ+N?0D>Ls3u)HvOm&@ow;qEzD%^rXjgoBkk02%L6; zn%87r|3+_4pSEQ^@`u8xwgyk54NSL2oZX^JG4DFpGn~(2Y^a|q1kOi6t!bN=1kv`0 z=eC5o2NXud9^h#n9r=A6+@ee2Tz44d=-VlSMEMyXs(cdy z=cAzJUE~AZX!cMK<7)9A3ZtqP2)F0uU9u3hNtYt=S|A;m(!t2EI}r+;kAj*zU|wra zP1<-Hox9{FjOxVqB`pu~nNjydU5e!{esuRxS7TpzAt7)+3Tm!Z^Jz^vt6Gh$rwS29 zz2d5{5ovtxPTQzUv8uh5D&FjDR0u6C1kOi6%@x?!no&%_R>r$Sr3j;P4+yhgJ`7Qf%8#N^DdcDkNS>kVH6lrn=q;jcUFD#Fx@(JRlF|6QGPZUusqNxvdc>d zoR5NDCUb*XmN-Np`2BI~LnM?<2x@_+S*z82OxT9epECuf$JCSw3)Yp|p6e zNmWOx&^D(q+rC&IA@F-g&7TZ2-D%l_nKmD1AHt|JJniQESDq!)GftPH;Iy)IspdRe z$JxG8z|RV`rj^cCj%+8V+g$7U623#<7a{gNKhmuqYsczRY%NukeqR%8i~hr32>e;0 z=9P&FMXCSy3AXC<{0XCe3=FaJleN_^ajh;z=-{4Ib9subXrN}U-5>mK)U5dBdi_D`HbZ%?P#{HysGPV*iAC&4RHKeE&zo_I&_t>|I=t$l%8veLo{9zrSF{Q`1g8KBQt;JUem~OD#bQ3TQTLl((!+sGotmlH4bt2 zUbLQPf#csjZ)Hvfn&3BvW*$$m-D|K;vp^rP5pJ8fCVmZFmR9lwKb zMzLJQkE#O6M0^$zVFqO9*)J=V?f z?{^MmR$#YvZBC0Th1g!sa5IZOa(u17CN9(Gl?<_4U!_~`{=QV7UCbeB%w5Xj_BmgA z+kL0)`Ghh;Onl~eA6p}&*0h0No6=u>f{h%di<`G9gxJsVbf&|*m+C0`{0O#t@v4z& zWd4=7*@u`yePWs1|xB2X(5W%3bD80@BR2q zsrfgkc~QNg8;n~!N}CvkKLva}zO&5YLcd&fH&eHLF}D8}V!y}r|K%<&)7^bT?ECq@ zv(8_xSDzbV?~{;j9Z)6nyNYAc{))R9v0aKD{X^`ZQg~WgveZ1sB()M*Y%XTLNX^73 ze7E>|JmF|oMfzMMzuByDE+HaYhS;C*?6VThmg%T9Ev#u>a%*zm=#kCE#3=kpOR>t; znX+;7VW&2G41D$Xt3vE<+$C+n-2cAwv0t6&Ww59D#N(w9e@zLozvVgAKTEC9QS*6& z8b8#uP#-ht%Pj+=MkR*WJFVhA6T6oGM|f#3l$H``-kr2nh{Qc1_R8E*?){%DbkuzE zzW)v7|EQxm`OaHG| zjTEBhtWbL{j@s}^YCa+Tu)8XKY=XJ9wwrS1E3ywqg&&Y#7hg})QWEyqb~c@4W<(D$ zP-N>GYR}K#;mKZ7YubtN&Z^kR>1NEJ8wW88-;;bFGy9pAz3Zl!x5B&(6hnD>cHKGr zZe1gF)Lg^T%vA+BO)$GQ8g5_|{-mXd`@BfCKQ`Vx=)c$-#d`Npd+T7Hotd~&N6nMp z&-GVlSB)_(qlOt6g}*^53eRhz{JCfU#Pbc+<+*&1llhy<8KvKA==g2!nHZ^igoN5P z{`arHWM0)$%6qD(!IR8tRjLS4V@{|&8%K4~q~LP^>8j7&cWm7 zk0T8%ohHvTW4n3_kuA*eoxF32(oyriK@lIzwh1%M>MI&pFbXHuNwIX{P|Nv&GtC=! zO9|mWFx39PNp`6DI_R`qCHRarFO_&{!`E0A==fP}bdT0i^F*D~9a1aQnrs#wI!s{{ zPO_6?Yo0EtH9RJpQ_4$$^X^b<+P9G#lxZJr&c3$Tg0B%>nkxZ0Ym@lS0=1^amMN+{ z+{T%-C{$q-&Qp+L_^L4VnEP4w_IxDzS!Qf6@trhDl} z3SS-ja$<*1UZFp5MXkEq&Mdn#U5K|f$Ms`LnHU{4Ki7WXF0?+a%w5y76Gma*7b#XO zeypy2^)#Jhei3K;P`gJuuI)P?W!}TJt^8a?>7HhK{X9b8nL*TiE>+vAHa2c$RtwHf z7=_=J6#AFW-=G-auMfK+%-n+}Z-)S7SMwh#N@h{%1Vb<*Cz0p#LlYyW$t;Op+ z6ddbf7Hj4z&JW_d#nOv2c(|T8P?!L-G;0Z_6Tm#wWfiecTn#b={7N;6BPip?} z+@%z@3q>j7`&pw%um?|!{eSN^bC>jgd!F*0*SwsU%z;;pk9`^m5&Ub&zjv(OKe&ew zXic-;&qtNAL>b2l`VvOro~INy@8zS=98pH&{|MZ{M9m%kmX)Ex8PBX}hw&E#WgDYJAGjG~3h4bgJD1Tej)C5co8S znlGFK^3&;@jf_%z0>m>XepgZ~cdbeGZz;A3Et(KM%ivQHJ}q&cSFcH<&ZO9$dr5&` z7qzD8Z>mswiC`mfX?^jtdRo!(JO87+d_-#==;awfWx+IPjM zF|wNY4gTrl_^bSKFh-Xm%UV}@ee8;@m&rjGRda>oQ*>Y0YF&y(z8_Szou20O zvQpq@6lzVgJUp(xj0-e9N?cVKRrRFfy0pN)N|)ly)#K{Ggh2CqX({l^fSOlWxccbG zt-)rKPV2m`|2wQXls>r%`p(1=#-xng+Ckpgo9HFu{R zTbasFaxwF~`Kd6fp>kwY_Fq@)QbY}_OkOiwOyi3bm=mb^Oq@}GR&##jDs@X?RNz=g zMy}OQW$k%ha;mRyjJN_Tnk~s&P zkB|a$0=1?EST#e*@04xr14sOz=z??wMeL0)7rAnz+jIcu26h>8h%`1hRQ7*?;=~686YD>G! zE5@FpQeaM?=KI|!FB&u1#eCQPh{CAmWgQvyZu}};ioL76Xv0JovtfV~m=mb^#CkwE zy3Y9#yeLUwRM&2fjH+E|l`e&E>vH6_%hNotTnfwy)LcVfGAsFTM)_`tP#Co?#*tA+ zVxx5_ny?ta;?{oz<^*a@J96GsKAazIxaJ3=3O;dUR4un?U5chRP1T5Vu)|#`FegxR z&;FXj)oIR;6WcynFltZ(M@H$ZqjV|mx(-)$I0vg-kOFf8HQz1Oi?gizI>THSUCn|~ z6zW(5$nG4aOR?wNEX)1ZGtBI5LxsQ`M6GH2nvbFByrw^(!#ag4@wldsYyB)*jiJyz zDYj+aQefVp=IOv+cxJd$u<>@pDuq$Sb~|z~;*{J&;Jd!}!^oer)?>C5m_?|0jV!z; zjW~0~D3N1{!l*M>9XYrwDO#6ez~Y|t_23m_+ndEgU>2d~`>P4Q)O3oAnNVo1!l;-$ zjvO2|C0dsvVxljV=d3;NECpr}YW|(KtU>ouJk8NV`YDXc#%su#tF>i(qID_W`PHDl zoVDS-rNAsg%{}|C{6d?@2AX+N8!C))``wX)E51ePQaD}wg<5b94mc$RW)W)6!D?sJ z8_pa(WQ@1$>`?znkVAS5ajvTb~ zi_)cdmO4%CVc}Oy3d|zZe0C{ptL5UC8Rkouhu#>4StP|c&uLWsaf)rl)M5&E!*E{> z_uF{=s?jtma3IC@djTmhi%@IYqE+K)k87|oY^ICCs3Myj85KBR?&ERi$aUk$k}KG_ z6d(oW1ZqAfym}zrJbcAC&@s2dr~`cE%)F{?njNJ}ab@K|Ds}dX(Pn}am=maZ2Wx!* zHJi%UsP&&L72WYofOQMwc!8v>{_=U~p2QeaM?<~y10^(bPyr+IhZWeY~7kt3t} z4T#eJBf8Y1TbzS+Zc2eUfm+jUE-pxu_^xl~fNd6xvV}V`YD-|0E=9g&1*t9P;IdXy zU{0XsD!us2sxxQQ)v2>A7&ZQyBctAVN9j@|thua;b4JC+NP#(lnorj(n5))tejMBE zYQd;!wH+CCw{ny&#i7u-ssdltE>lHwBYR7dj4 z#0a0nRNRrqy=~m{<~5WwD%duCnK@Xyh!mI;sQG$cY`Re1yQf zL#=6dGRDxp0>Or@RbvCAa&XN|X4S*WTq{KdjHdarxXoExyO8b-v}u!GU#F>Qa1Tag?(*{;(97MX31+(!-xxOmi`_JC!joY8_XnWL75}AG}hR zq8v{#`eytrjm@j#yF2#is9`u59u*+U4FpE%Y z+SG;4cuS^M%kA*aW#6YurtQ43-XOxT$@lF2xwPODd3aa6^m~m_?|04p!V8b&4}8-=dZ_jEeJcT-Ba!kJP1bil3t_ zEK*9g5(2XbH9wy_@3B07JHtF*VL>WJVHQa-n@_S{S;DJ>9=i;z<-)2ktQO;%iOVCX zVQPx)2d)v`1?P)8A!-jld~e4UC#|$&pdNU6EC2eBZuiFqxc#@e8EDoItH< z>xOotG+rGn{CB*8Q7b+=GOAGV6}l8jEdJyi?0QWK%n8)|Ngdscex2=NR%*J;z^H4L z92s?fQc;SQJr(}`6wwcCs6YQuqG!}EzYPt zwTc@U^)thfQEwk`4GX-Urv1iZJB!9{QeaM?=D(8alT|OykF6mGY#4<#6H@G{Gg)Qj z`$T_FDKIBc^Qo=Wt(JY9QLWEsv0)TuloZ*<_avuZcG|i$)J&|W#ELeo-s6h+Uwe{z znqmv@Aq8d;YMwE&zZ3N;7HsGrKN%Q>^=VR=2RhMt&cQ4%rNEp(&DYvEp69jeig7ME z!@wx41e2m#d`r5+IT*4@3d{-An$~-GecC$9#VpkFf`L(3Qzpeo7A~BFhg(R2If0tb zhVSDl^=+Q!)VX^MjKZ2SDH^jN&cVEkrNEp(%~{*)hZ@2eb-l`R1Ea8}Op2#0qFF4e zECuESYJNVSdr-x4ew_KOyMa+yM5k=|P@xlYY6eWHDB7=@K*Qh2|ws`}rZY&JbrK%u}&C)AqO zD!e&yrI%LriktawMQpi~*361n%sW{rd*K(J!dKpCV*gT3h`n6#tFbN-xlCxj;`sHV zvRD2%xNMhZVie{)z8>#?H0ecESsXbf1zulKb2r4ReQ3eCyG@fiQ+Xj zM>@VMd+C)rYJMMMr&5nbSyG4Q@i8z8@8P8|hD;?Zi$)Kmz$a|fn%3QzM#Fj)@jf%p zO}xg6%&Kz!S(W1IanxLq@@gjS3eBHd>|SCjM&Z-F6lpAWvbeQZ3S3D;&39xUW>V_z zO5P9u>F@b^zcqPtc2*AS>?~))r!Webkv&GzUEkZxUoj+u4n5MM&W9`6gfS{(tQ?r z|B?dt(ok#K${8c+^gZR>^yqH!8e0zh-**+dT1U<22Rrtopz#e;yVQN9Fbenaq?psP zA5CQOqo)+OXO5aHQd;+!tYX|3sf$QebTiYE8>Kttri$-_d*A$jah1!pighIsXQi99^TM*0cfkn)G^m+f@6f zCWKK~mm@{%(={o}j<%`WUP^&=M5s0G(;4p5SD}};HLSUKjejeW_`AwHm4aH+oLd+B z_mg_z9Dhd@(*H$a4U-hnW!=rp&-P~dbu)_=!|(Qt)#J`)pDfx&yB2%Yy0c^{{onuQ Wf6x4HP5VDF>;ErUv-q#pwEqtq*k*44 literal 0 HcmV?d00001 From 15293964f8de9c046c33ce76f73143562b092e07 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 08:29:13 +0200 Subject: [PATCH 099/379] Better description for Prime Tower Purge Volume CURA-3094 --- 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 94d0087422..c5aefb021f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4417,7 +4417,7 @@ "prime_tower_purge_volume": { "label": "Prime Tower Purge Volume", - "description": "Amount of filament to be purged when wiping on prime tower. This is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", + "description": "Amount of filament to be purged when wiping on prime tower. Purging is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", "type": "float", "enabled": "resolveOrValue('prime_tower_enable')", "unit": "mm³", From af1e18df24dab3911c3891b45adf048afad0100c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 08:30:01 +0200 Subject: [PATCH 100/379] Enabled Prime Power Purge when Prime Tower Wipe is enabled CURA-3094 --- 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 c5aefb021f..21e2a7bb79 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4419,7 +4419,7 @@ "label": "Prime Tower Purge Volume", "description": "Amount of filament to be purged when wiping on prime tower. Purging is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", "type": "float", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "resolveOrValue('prime_tower_wipe_enabled')", "unit": "mm³", "default_value": 0, "minimum_value": "0", From 6d6fec46b2103b1b79741e9dfa6926989cd55d79 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 26 Jun 2017 08:18:12 +0100 Subject: [PATCH 101/379] In geometry41core, take the line width/depth from the second vertex rather than the first. This change fixes a problem where a sequence of lines that have different widths are displayed with the widths shifted by 1, i.e. line 1 had the width of line 2 and so on. --- plugins/LayerView/layers3d.shader | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/layers3d.shader b/plugins/LayerView/layers3d.shader index 6f5e986eec..e8fe425c70 100755 --- a/plugins/LayerView/layers3d.shader +++ b/plugins/LayerView/layers3d.shader @@ -130,9 +130,9 @@ geometry41core = // fixed size for movements size_x = 0.05; } else { - size_x = v_line_dim[0].x / 2 + 0.01; // radius, and make it nicely overlapping + size_x = v_line_dim[1].x / 2 + 0.01; // radius, and make it nicely overlapping } - size_y = v_line_dim[0].y / 2 + 0.01; + size_y = v_line_dim[1].y / 2 + 0.01; g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); From 35e0d1e607096418487876e228e0b6ef77c3b6d4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 09:24:44 +0200 Subject: [PATCH 102/379] Add entry for new materials in 2.6.1 Contributes to issue CURA-3960. --- plugins/ChangeLogPlugin/ChangeLog.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 36ac5d3424..b7ed1e8da0 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,3 +1,7 @@ +[2.6.1] +*New profiles +The Polypropylene material is added and supported with the Ultimaker 3. Support for CPE+ and PC with 0.8mm nozzles is added as well. + [2.6.0] *Cura versions Cura 2.6 has local version folders, which means the new version won’t overwrite the existing configuration and profiles from older versions, but can create a new folder instead. You can now safely check out new beta versions and, if necessary, start up an older version without the danger of losing your profiles. From 9cc2b0fc82044c5192bdc799b92c94cdae6d8b25 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 09:55:52 +0200 Subject: [PATCH 103/379] Fix link to material name The material was named generic_polypropylene, not generic_pp. Contributes to issue CURA-3960. --- resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg index 8de84ae586..3d508e334f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = draft -material = generic_pp_ultimaker3_AA_0.4 +material = generic_polypropylene_ultimaker3_AA_0.4 weight = -2 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg index 81e018a742..264299f20d 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = fast -material = generic_pp_ultimaker3_AA_0.4 +material = generic_polypropylene_ultimaker3_AA_0.4 weight = -1 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg index 62cc558ff6..d70eddf2a7 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = normal -material = generic_pp_ultimaker3_AA_0.4 +material = generic_polypropylene_ultimaker3_AA_0.4 weight = 0 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index a9ad0a58bd..661ac6c2ad 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = draft -material = generic_pp_ultimaker3_AA_0.8 +material = generic_polypropylene_ultimaker3_AA_0.8 weight = -2 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index 74ab389d56..cd2d5bd3db 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = superdraft -material = generic_pp_ultimaker3_AA_0.8 +material = generic_polypropylene_ultimaker3_AA_0.8 weight = -4 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index f51e116cac..0610b606fd 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = verydraft -material = generic_pp_ultimaker3_AA_0.8 +material = generic_polypropylene_ultimaker3_AA_0.8 weight = -3 setting_version = 1 From c2f9786303ba4b7998915675f85f28e987d024cc Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 10:59:58 +0200 Subject: [PATCH 104/379] Fix enable Prime Power Purge when Prime Tower Wipe is enabled CURA-3094 --- resources/definitions/fdmprinter.def.json | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 21e2a7bb79..861caa7c80 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4414,19 +4414,6 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "prime_tower_purge_volume": - { - "label": "Prime Tower Purge Volume", - "description": "Amount of filament to be purged when wiping on prime tower. Purging is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", - "type": "float", - "enabled": "resolveOrValue('prime_tower_wipe_enabled')", - "unit": "mm³", - "default_value": 0, - "minimum_value": "0", - "maximum_value_warning": "0.5", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "dual_pre_wipe": { "label": "Wipe Nozzle After Switch", @@ -4437,6 +4424,19 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "prime_tower_purge_volume": + { + "label": "Prime Tower Purge Volume", + "description": "Amount of filament to be purged when wiping on prime tower. Purging is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", + "type": "float", + "enabled": "dual_pre_wipe", + "unit": "mm³", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "0.5", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "ooze_shield_enabled": { "label": "Enable Ooze Shield", From ffd17664d05e1c36ce88abc876b15d6e8e677fae Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 26 Jun 2017 11:49:18 +0200 Subject: [PATCH 105/379] Fixed names of 2 pp profiles CURA-3960 --- resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index b1194693ac..d3a6dc3b2f 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast +name = Normal definition = ultimaker2_plus [metadata] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 039f24bfe0..42745b51f8 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast Print +name = Fast definition = ultimaker2_plus [metadata] From bc65cc1102cc9d702d31f36d5a481e8546608e13 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 12:49:31 +0200 Subject: [PATCH 106/379] Fix code style CURA-3930 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index bb834324a8..fdbee36a57 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -234,7 +234,7 @@ class StartSliceJob(Job): for key in stack.getAllKeys(): # Do not send settings that are not settable_per_extruder. - if stack.getProperty(key, "settable_per_extruder") == False: + if not stack.getProperty(key, "settable_per_extruder"): continue setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key From edee53b0b16950436878cc0be994744b9e943ae4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 26 Jun 2017 13:00:59 +0200 Subject: [PATCH 107/379] Scroll setting with active focus into view --- resources/qml/Settings/SettingCategory.qml | 24 ++++++++++++++++--- resources/qml/Settings/SettingCheckBox.qml | 8 +++++++ resources/qml/Settings/SettingComboBox.qml | 14 ++++++++++- resources/qml/Settings/SettingExtruder.qml | 8 +++++++ resources/qml/Settings/SettingItem.qml | 5 ++-- .../qml/Settings/SettingOptionalExtruder.qml | 8 +++++++ resources/qml/Settings/SettingTextField.qml | 8 +++++++ resources/qml/Settings/SettingView.qml | 4 ++++ 8 files changed, 73 insertions(+), 6 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 75514e7c1b..6220d6429e 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -14,10 +14,11 @@ Button { style: UM.Theme.styles.sidebar_category; - signal showTooltip(string text); - signal hideTooltip(); + signal showTooltip(string text) + signal hideTooltip() signal contextMenuRequested() signal showAllHiddenInheritedSettings(string category_id) + signal focusReceived() text: definition.label iconSource: UM.Theme.getIcon(definition.icon) @@ -25,7 +26,24 @@ Button { checkable: true checked: definition.expanded - onClicked: { forceActiveFocus(); definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key) } + onClicked: + { + forceActiveFocus(); + if(definition.expanded) + { + settingDefinitionsModel.collapse(definition.key); + } else { + settingDefinitionsModel.expandAll(definition.key); + } + } + onActiveFocusChanged: + { + if(activeFocus) + { + base.focusReceived(); + } + } + UM.SimpleButton { id: settingsButton diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 07b1f865be..8f21e19713 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -62,6 +62,14 @@ SettingItem propertyProvider.setPropertyValue("value", !checked); } + onActiveFocusChanged: + { + if(activeFocus) + { + base.focusReceived(); + } + } + Rectangle { anchors diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 4c14d2032b..5d1cc287b3 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -94,7 +94,19 @@ SettingItem } } - onActivated: { forceActiveFocus(); propertyProvider.setPropertyValue("value", definition.options[index].key) } + onActivated: + { + forceActiveFocus(); + propertyProvider.setPropertyValue("value", definition.options[index].key); + } + + onActiveFocusChanged: + { + if(activeFocus) + { + base.focusReceived(); + } + } Binding { diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index b00b6774be..f4b85bdd99 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -27,6 +27,14 @@ SettingItem propertyProvider.setPropertyValue("value", model.getItem(index).index); } + onActiveFocusChanged: + { + if(activeFocus) + { + base.focusReceived(); + } + } + currentIndex: propertyProvider.properties.value MouseArea diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 7108d2a04c..dca8f63076 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -32,9 +32,10 @@ Item { property var stackLevels: propertyProvider.stackLevels property var stackLevel: stackLevels[0] + signal focusReceived() signal contextMenuRequested() - signal showTooltip(string text); - signal hideTooltip(); + signal showTooltip(string text) + signal hideTooltip() signal showAllHiddenInheritedSettings(string category_id) property string tooltipText: { diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index e2ca20571c..f7f86a77c0 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -31,6 +31,14 @@ SettingItem propertyProvider.setPropertyValue("value", model.getItem(index).index); } + onActiveFocusChanged: + { + if(activeFocus) + { + base.focusReceived(); + } + } + Binding { target: control diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index b9f11ea80d..7f495aea02 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -105,6 +105,14 @@ SettingItem propertyProvider.setPropertyValue("value", text) } + onActiveFocusChanged: + { + if(activeFocus) + { + base.focusReceived(); + } + } + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default"); diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 7cb45ff75f..752665f2b7 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -298,6 +298,10 @@ Item } Cura.SettingInheritanceManager.manualRemoveOverride(category_id) } + onFocusReceived: + { + contents.positionViewAtIndex(index, ListView.Contain); + } } } From 8917762ed506079929de3a1ca6ebf487f5185af2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 26 Jun 2017 13:03:28 +0200 Subject: [PATCH 108/379] Animate scrolling focussed item into view --- resources/qml/Settings/SettingView.qml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 752665f2b7..c4477460e4 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -300,13 +300,23 @@ Item } onFocusReceived: { + animateContentY.from = contents.contentY; contents.positionViewAtIndex(index, ListView.Contain); + animateContentY.to = contents.contentY; + animateContentY.running = true; } } } UM.I18nCatalog { id: catalog; name: "cura"; } + NumberAnimation { + id: animateContentY + target: contents + property: "contentY" + duration: 50 + } + add: Transition { SequentialAnimation { NumberAnimation { properties: "height"; from: 0; duration: 100 } From 7813bfc543a9d56ecc9715d47b0cda024d3452ce Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 26 Jun 2017 13:16:14 +0200 Subject: [PATCH 109/379] No longer crash when trying to get non existing extruder stacks CURA-3953 --- cura/Settings/ExtruderManager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 3baa2f5dce..70f95caae5 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -78,8 +78,9 @@ class ExtruderManager(QObject): def extruderIds(self): map = {} global_stack_id = Application.getInstance().getGlobalContainerStack().getId() - for position in self._extruder_trains[global_stack_id]: - map[position] = self._extruder_trains[global_stack_id][position].getId() + if global_stack_id in self._extruder_trains: + for position in self._extruder_trains[global_stack_id]: + map[position] = self._extruder_trains[global_stack_id][position].getId() return map @pyqtSlot(str, result = str) From d3bc6258526ef9f214abace4b76787a62395c10d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 13:49:12 +0200 Subject: [PATCH 110/379] Fix prime tower purge description text CURA-3094 --- 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 861caa7c80..873a0ae274 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4427,7 +4427,7 @@ "prime_tower_purge_volume": { "label": "Prime Tower Purge Volume", - "description": "Amount of filament to be purged when wiping on prime tower. Purging is useful for compensating the filament lost by oozing during the inactivity of the nozzle.", + "description": "Amount of filament to be purged when wiping on the prime tower. Purging is useful for compensating the filament lost by oozing during inactivity of the nozzle.", "type": "float", "enabled": "dual_pre_wipe", "unit": "mm³", From 6cd7c8eb0827949d7a933ed0dd20de21f327b1e1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 14:32:48 +0200 Subject: [PATCH 111/379] Fix stand-by temperature The stand-by temperature in the material profiles is the temperature at which the build plate levelling should be done. The actual stand-by temperature in Cura should be 100, so these profiles have to overwrite the material profile then. Contributes to issue CURA-3960. --- resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg | 1 + resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg | 1 + resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg | 1 + 6 files changed, 6 insertions(+) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg index 3d508e334f..5aa4b0d253 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -34,6 +34,7 @@ material_final_print_temperature = 205 material_initial_print_temperature = 210 material_print_temperature = 215 material_print_temperature_layer_0 = 220 +material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False prime_tower_size = 16 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg index 264299f20d..1f0fa009ba 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -34,6 +34,7 @@ material_final_print_temperature = 195 material_initial_print_temperature = 205 material_print_temperature = 207 material_print_temperature_layer_0 = 210 +material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False prime_tower_size = 16 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg index d70eddf2a7..5e18949534 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -33,6 +33,7 @@ material_final_print_temperature = 195 material_initial_print_temperature = 200 material_print_temperature = 205 material_print_temperature_layer_0 = 208 +material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False prime_tower_size = 16 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index 661ac6c2ad..2b4244f30d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -26,6 +26,7 @@ jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) material_bed_temperature_layer_0 = =material_bed_temperature material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index cd2d5bd3db..c1f11dda2b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -26,6 +26,7 @@ jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) material_bed_temperature_layer_0 = =material_bed_temperature material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index 0610b606fd..b428a7d4c0 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -26,6 +26,7 @@ jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) layer_height = 0.3 material_bed_temperature_layer_0 = =material_bed_temperature material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 From 0f9cfa0304474cce481316ddfa2b4ab4cad2b5b8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 26 Jun 2017 14:35:37 +0200 Subject: [PATCH 112/379] Fix tab order after expanding categories or using search This reimplements the behavior of pressing tab/backtab to force the correct order of items in the listview. --- resources/qml/Settings/SettingCategory.qml | 12 ++++++++ resources/qml/Settings/SettingCheckBox.qml | 11 ++++++- resources/qml/Settings/SettingComboBox.qml | 10 +++++++ resources/qml/Settings/SettingExtruder.qml | 10 +++++++ resources/qml/Settings/SettingItem.qml | 1 + .../qml/Settings/SettingOptionalExtruder.qml | 10 +++++++ resources/qml/Settings/SettingTextField.qml | 11 ++++++- resources/qml/Settings/SettingView.qml | 30 +++++++++++++++++++ 8 files changed, 93 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 6220d6429e..e8c0983398 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -19,6 +19,9 @@ Button { signal contextMenuRequested() signal showAllHiddenInheritedSettings(string category_id) signal focusReceived() + signal setActiveFocusToNextSetting(bool forward) + + property var focusItem: base text: definition.label iconSource: UM.Theme.getIcon(definition.icon) @@ -44,6 +47,15 @@ Button { } } + Keys.onTabPressed: + { + base.setActiveFocusToNextSetting(true) + } + Keys.onBacktabPressed: + { + base.setActiveFocusToNextSetting(false) + } + UM.SimpleButton { id: settingsButton diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 8f21e19713..4ef7f59a77 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -11,13 +11,13 @@ import UM 1.2 as UM SettingItem { id: base + property var focusItem: control contents: MouseArea { id: control anchors.fill: parent hoverEnabled: true - activeFocusOnTab: true property bool checked: { @@ -62,6 +62,15 @@ SettingItem propertyProvider.setPropertyValue("value", !checked); } + Keys.onTabPressed: + { + base.setActiveFocusToNextSetting(true) + } + Keys.onBacktabPressed: + { + base.setActiveFocusToNextSetting(false) + } + onActiveFocusChanged: { if(activeFocus) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 5d1cc287b3..c29ac123d6 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -10,6 +10,7 @@ import UM 1.1 as UM SettingItem { id: base + property var focusItem: control contents: ComboBox { @@ -108,6 +109,15 @@ SettingItem } } + Keys.onTabPressed: + { + base.setActiveFocusToNextSetting(true) + } + Keys.onBacktabPressed: + { + base.setActiveFocusToNextSetting(false) + } + Binding { target: control diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index f4b85bdd99..15496eaa8b 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -11,6 +11,7 @@ import Cura 1.0 as Cura SettingItem { id: base + property var focusItem: control contents: ComboBox { @@ -35,6 +36,15 @@ SettingItem } } + Keys.onTabPressed: + { + base.setActiveFocusToNextSetting(true) + } + Keys.onBacktabPressed: + { + base.setActiveFocusToNextSetting(false) + } + currentIndex: propertyProvider.properties.value MouseArea diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index dca8f63076..112edb5049 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -33,6 +33,7 @@ Item { property var stackLevel: stackLevels[0] signal focusReceived() + signal setActiveFocusToNextSetting(bool forward) signal contextMenuRequested() signal showTooltip(string text) signal hideTooltip() diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index f7f86a77c0..0fd36564a1 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -11,6 +11,7 @@ import Cura 1.0 as Cura SettingItem { id: base + property var focusItem: control contents: ComboBox { @@ -39,6 +40,15 @@ SettingItem } } + Keys.onTabPressed: + { + base.setActiveFocusToNextSetting(true) + } + Keys.onBacktabPressed: + { + base.setActiveFocusToNextSetting(false) + } + Binding { target: control diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 7f495aea02..2991c24d57 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -9,6 +9,7 @@ import UM 1.1 as UM SettingItem { id: base + property var focusItem: input contents: Rectangle { @@ -93,7 +94,15 @@ SettingItem right: parent.right verticalCenter: parent.verticalCenter } - activeFocusOnTab: true + + Keys.onTabPressed: + { + base.setActiveFocusToNextSetting(true) + } + Keys.onBacktabPressed: + { + base.setActiveFocusToNextSetting(false) + } Keys.onReleased: { diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index c4477460e4..06e53cc03b 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -168,6 +168,8 @@ Item onVisibilityChanged: Cura.SettingInheritanceManager.forceUpdate() } + property var indexWithFocus: -1 + delegate: Loader { id: delegate @@ -300,11 +302,39 @@ Item } onFocusReceived: { + contents.indexWithFocus = index; animateContentY.from = contents.contentY; contents.positionViewAtIndex(index, ListView.Contain); animateContentY.to = contents.contentY; animateContentY.running = true; } + onSetActiveFocusToNextSetting: + { + if(forward == undefined || forward) + { + contents.currentIndex = contents.indexWithFocus + 1; + while(contents.currentItem && contents.currentItem.height <= 0) + { + contents.currentIndex++; + } + if(contents.currentItem) + { + contents.currentItem.item.focusItem.forceActiveFocus(); + } + } + else + { + contents.currentIndex = contents.indexWithFocus - 1; + while(contents.currentItem && contents.currentItem.height <= 0) + { + contents.currentIndex--; + } + if(contents.currentItem) + { + contents.currentItem.item.focusItem.forceActiveFocus(); + } + } + } } } From c9aa8b4dfdc87d498f6a17427bff1ea029d65cc5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 14:58:14 +0200 Subject: [PATCH 113/379] Put stand-by temperature back in optimised profiles The stand-by temperature should be 175 for these profiles because the UM3 firmware levels the bed with that temperature. It should be 100 in the quality profiles because that's what the stand-by temperature should be when standing by while the other nozzle is printing. Contributes to issue CURA-3960. --- resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg | 1 + resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg | 1 + resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 1 + resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg | 1 + resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 + .../quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 + 12 files changed, 12 insertions(+) diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index 59600a00ae..3ed8a5e13d 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -36,6 +36,7 @@ material_flow = 106 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_wipe_enabled = True retraction_count_max = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index 3cae3e53c9..9f2b4cc718 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -36,6 +36,7 @@ material_flow = 106 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_wipe_enabled = True retraction_amount = 7 diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index 96146c5b68..f30e20cf14 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -34,6 +34,7 @@ material_final_print_temperature = =material_print_temperature - 21 material_flow = 106 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature_layer_0 = =default_material_print_temperature +material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_wipe_enabled = True retraction_count_max = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg index fbcde6cdeb..d40d9430d1 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg @@ -19,6 +19,7 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 10 material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 retraction_combing = off retraction_hop = 0.1 retraction_hop_enabled = False diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index 128dbe5ca5..72a280e97b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -20,6 +20,7 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 5 material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 prime_tower_enable = True retraction_combing = off retraction_hop = 0.1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index 7d8dc79748..e34b1661ff 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -20,6 +20,7 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 7 material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 prime_tower_enable = True retraction_combing = off retraction_hop = 0.1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg index 7cff30cdb2..9ee1889620 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg @@ -17,6 +17,7 @@ infill_before_walls = True line_width = =machine_nozzle_size * 0.875 material_print_temperature = =default_material_print_temperature - 5 material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 raft_airgap = 0.5 raft_margin = 15 skin_overlap = 0 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg index 8ca95994e4..011c95a0a5 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -17,6 +17,7 @@ infill_before_walls = True layer_height = 0.4 line_width = =machine_nozzle_size * 0.875 material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 raft_airgap = 0.5 raft_margin = 15 skin_overlap = 0 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg index 62b06e7df7..dbaa4806cb 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -18,6 +18,7 @@ layer_height = 0.3 line_width = =machine_nozzle_size * 0.875 material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 raft_airgap = 0.5 raft_margin = 15 skin_overlap = 0 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 4f5a8f99dd..13262f6a44 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -33,6 +33,7 @@ material_flow = 105 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature - 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index c91bf4c107..b2b9c4f940 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -34,6 +34,7 @@ material_flow = 105 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature = =default_material_print_temperature + 2 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index 78094b33b4..f3fe029355 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -33,6 +33,7 @@ material_final_print_temperature = =material_print_temperature - 21 material_flow = 105 material_initial_print_temperature = =material_print_temperature - 16 material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 From 568b0c2285b76a00ebc7f761469260957c03c527 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 26 Jun 2017 15:02:24 +0200 Subject: [PATCH 114/379] Changed start code of Dagoma printer to indicate it's created by cura. Originally it said it was created by Cura-by-dagoma, which is not the case. CURA-3966 --- resources/definitions/dagoma_discoeasy200.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index cc0dca2918..3408c917a6 100755 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -50,7 +50,7 @@ "default_value": "RepRap" }, "machine_start_gcode": { - "default_value": ";Gcode by Cura-by-dagoma for DiscoEASY200 V2.6\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{print_temperature}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{print_temperature}\nM140 S{material_bed_temperature}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F3000\n" + "default_value": ";Gcode by Cura\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{print_temperature}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{print_temperature}\nM140 S{material_bed_temperature}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F3000\n" }, "machine_end_gcode": { "default_value": "\nM104 S0\nM106 S255 ;start fan full power\nM140 S0 ;heated bed heater off (if you have it)\n;Home machine\nG91 ;relative positioning\nG1 E-1 F{retraction_speed} ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+3 F3000 ;move Z up a bit and retract filament even more\nG90\nG28 X Y\n;Ventilation forcee\nM107 ;stop fan\n;Shut down motor\nM84 ;shut down motors\n" From c0b6df0bfa5d61a0450a390c02d5834bceb6916d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 15:14:22 +0200 Subject: [PATCH 115/379] Increase warning value for outer wall wipe distance For polypropylene a wipe distance of twice the nozzle size is fine. Even required, since the material warps so much that it breaks open automatically if a breach starts to appear at the seam. For other warping materials this could also be a problem, so let's just increase the warning value. Contributes to issue CURA-3960. --- 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 977d11e14a..f03c842e0c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -858,7 +858,7 @@ "default_value": 0.2, "value": "machine_nozzle_size / 2", "minimum_value": "0", - "maximum_value_warning": "machine_nozzle_size", + "maximum_value_warning": "machine_nozzle_size * 2", "settable_per_mesh": true }, "top_bottom_thickness": From d1211e395135bde93ca54fc330bf89e3fa33750e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 26 Jun 2017 15:16:26 +0200 Subject: [PATCH 116/379] Add a setting for Horizontal Expansion for the first layer --- 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 40f224a98a..88cbc6dd48 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1136,6 +1136,19 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, + "xy_offset_layer_0": + { + "label": "Initial Layer Horizontal Expansion", + "description": "Amount of offset applied to all polygons in the first layer. A negative value can compensate for elephants foot.", + "unit": "mm", + "type": "float", + "minimum_value_warning": "-1", + "maximum_value_warning": "1", + "default_value": 0, + "value": "xy_offset", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, "z_seam_type": { "label": "Z Seam Alignment", From b617c8be9c69c0764ad3387d1dedc50f7759745a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 15:25:38 +0200 Subject: [PATCH 117/379] Remove minimum warning value for z-hop height It was giving a warning for 0.8mm polypropylene because that was set to 0.5mm hop. It was decided that a minimum value at all for z-hop is nonsense because you can just disable z-hop without getting a warning. I'm still setting it to zero because negative will still go wrong in your print. Contributes to issue CURA-3960. --- 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 f03c842e0c..0fa025d13f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2726,7 +2726,7 @@ "unit": "mm", "type": "float", "default_value": 1, - "minimum_value_warning": "0.75 * machine_nozzle_size", + "minimum_value_warning": "0", "maximum_value_warning": "10", "enabled": "retraction_enable and retraction_hop_enabled", "settable_per_mesh": false, From aee0cf72074e7f4db55351003a751c4dce308201 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 15:47:49 +0200 Subject: [PATCH 118/379] Make expand_lower_skins inherit from expand_skins_into_infill And then also update the profiles to make the profiles end up at what it was originally (I confirmed this with the materials team). Contributes to issue CURA-3960. --- resources/definitions/fdmprinter.def.json | 1 + resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg | 1 - resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 - 7 files changed, 1 insertion(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0fa025d13f..c3c4a416f9 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1325,6 +1325,7 @@ "description": "Expand the bottom skin areas (areas with air below) so that they are anchored by the infill layers above and below.", "type": "bool", "default_value": false, + "value": "expand_skins_into_infill", "settable_per_mesh": true } } diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index 2b4244f30d..9124425312 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -15,7 +15,6 @@ brim_width = 25 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 17 expand_skins_expand_distance = =line_width * 2 -expand_skins_into_infill = True expand_upper_skins = True infill_before_walls = True infill_line_width = =round(line_width * 0.7 / 0.8, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index c1f11dda2b..d122d40294 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -15,7 +15,6 @@ brim_width = 25 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 17 expand_skins_expand_distance = =line_width * 2 -expand_skins_into_infill = True expand_upper_skins = True infill_before_walls = True infill_line_width = =round(line_width * 0.7 / 0.8, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index b428a7d4c0..09e12d0d7a 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -15,7 +15,6 @@ brim_width = 25 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 17 expand_skins_expand_distance = =line_width * 2 -expand_skins_into_infill = True expand_upper_skins = True infill_before_walls = True infill_line_width = =round(line_width * 0.7 / 0.8, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 13262f6a44..1df3d49cd0 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -14,7 +14,6 @@ setting_version = 1 brim_width = 8.75 cool_min_layer_time_fan_speed_max = 6 expand_skins_expand_distance = =line_width * 2 -expand_skins_into_infill = True expand_upper_skins = True gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 5 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index b2b9c4f940..106aa800b3 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -14,7 +14,6 @@ setting_version = 1 brim_width = 8.75 cool_min_layer_time_fan_speed_max = 6 expand_skins_expand_distance = =line_width * 2 -expand_skins_into_infill = True expand_upper_skins = True gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 5 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index f3fe029355..66d6b3b77d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -14,7 +14,6 @@ setting_version = 1 brim_width = 8.75 cool_min_layer_time_fan_speed_max = 6 expand_skins_expand_distance = =line_width * 2 -expand_skins_into_infill = True expand_upper_skins = True gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 5 From a5f3a1c9833c30862818bdd54a242dec33d2a5dc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 15:53:40 +0200 Subject: [PATCH 119/379] Remove maximum warning for gradual infill step height That 100mm figure was weird. 9cm was fine, but 10cm not? It's all going to print fine, really. Contributes to issue CURA-3960. --- resources/definitions/fdmprinter.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c3c4a416f9..bf28566f27 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1278,7 +1278,6 @@ "default_value": 1.5, "minimum_value": "0.0001", "minimum_value_warning": "3 * resolveOrValue('layer_height')", - "maximum_value_warning": "100", "enabled": "infill_sparse_density > 0 and gradual_infill_steps > 0 and infill_pattern != 'cubicsubdiv'", "settable_per_mesh": true }, From 8a0afa9c32e692470ab5fcdfe6d8a574978c66c6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 15:54:56 +0200 Subject: [PATCH 120/379] Enable prime tower purge volume when prime tower and wipe are both enabled --- 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 873a0ae274..105a9b5424 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4429,7 +4429,7 @@ "label": "Prime Tower Purge Volume", "description": "Amount of filament to be purged when wiping on the prime tower. Purging is useful for compensating the filament lost by oozing during inactivity of the nozzle.", "type": "float", - "enabled": "dual_pre_wipe", + "enabled": "resolveOrValue('prime_tower_enable') and dual_pre_wipe", "unit": "mm³", "default_value": 0, "minimum_value": "0", From a259217f52c147545e75191de0044c8a076f2cf0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 16:15:40 +0200 Subject: [PATCH 121/379] Remove gradual infill for PP This was delivered false by the materials team. It seems that in the end they decided to not use gradual infill for PP but only made the change in UM3, not UM2+. Removing gradual infill also requires me to set the infill density to 20% (the default). Contributes to issue CURA-3960. --- resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 3 --- resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg | 3 --- resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg | 3 --- resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 3 --- resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 3 --- .../quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg | 3 --- 6 files changed, 18 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index 53cc10468d..599c6f8d28 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -25,12 +25,9 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 2 -gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.4 / 0.38, 2) infill_overlap = 0 infill_pattern = cubic -infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True jerk_layer_0 = =jerk_topbottom diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index 9805becd93..cd5385e521 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -25,12 +25,9 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 2 -gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.4 / 0.38, 2) infill_overlap = 0 infill_pattern = cubic -infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True jerk_layer_0 = =jerk_topbottom diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index 3060cd3a0f..6b6cb5d7eb 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -25,13 +25,10 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 2 -gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.6 / 0.57, 2) infill_overlap = 0 infill_overlap_mm = 0 infill_pattern = cubic -infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True jerk_layer_0 = =jerk_topbottom diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index b1194693ac..07442b679c 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -25,13 +25,10 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 2 -gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.6 / 0.57, 2) infill_overlap = 0 infill_overlap_mm = 0 infill_pattern = cubic -infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True jerk_layer_0 = =jerk_topbottom diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 039f24bfe0..f40fa9f880 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -25,13 +25,10 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 3 -gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 infill_overlap_mm = 0 infill_pattern = cubic -infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True jerk_layer_0 = =jerk_topbottom diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 9bcd29dfa4..49ef6d91ec 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -25,13 +25,10 @@ cool_fan_full_at_height = =layer_height_0 + 4 * layer_height cool_fan_speed_max = 100 cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 -gradual_infill_step_height = =layer_height * 2 -gradual_infill_steps = 3 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 infill_overlap_mm = 0 infill_pattern = cubic -infill_sparse_density = 96 infill_wipe_dist = 0 jerk_enabled = True jerk_layer_0 = =jerk_topbottom From 93f4a7e399ccc01291f24e047f6f133231ee02d6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 26 Jun 2017 16:28:53 +0200 Subject: [PATCH 122/379] Fixed weights of a few profiles CURA-3845 --- .../quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index 128dbe5ca5..6b6c5c50d9 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = superdraft material = generic_cpe_plus_ultimaker3_AA_0.8 -weight = -2 +weight = -4 setting_version = 1 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index 7d8dc79748..52174549fa 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = verydraft material = generic_cpe_plus_ultimaker3_AA_0.8 -weight = -1 +weight = -3 setting_version = 1 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg index 182684087a..ad7306ed13 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = superdraft material = generic_cpe_ultimaker3_AA_0.8 -weight = -2 +weight = -4 setting_version = 1 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg index 189d64b5bb..f3ce457682 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = verydraft material = generic_cpe_ultimaker3_AA_0.8 -weight = -2 +weight = -3 setting_version = 1 [values] From cefbe54843cf9668e52e2d06d8072dd7fa5507ec Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 16:30:26 +0200 Subject: [PATCH 123/379] Fix double infill overlap settings These settings say the same, only the infill_overlap_mm one overwrites the infill_overlap setting. I therefore removed infill_overlap_mm so that the mm gets auto-calculated and none of the settings are overwritten any more (so they don't get greyed out). Contributes to issue CURA-3960. --- resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg | 1 - resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 1 - resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 1 - resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg | 1 - 4 files changed, 4 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index 6b6cb5d7eb..d232ab24a3 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -27,7 +27,6 @@ cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 infill_line_width = =round(line_width * 0.6 / 0.57, 2) infill_overlap = 0 -infill_overlap_mm = 0 infill_pattern = cubic infill_wipe_dist = 0 jerk_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index 07442b679c..8f54bf4b4e 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -27,7 +27,6 @@ cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 infill_line_width = =round(line_width * 0.6 / 0.57, 2) infill_overlap = 0 -infill_overlap_mm = 0 infill_pattern = cubic infill_wipe_dist = 0 jerk_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index f40fa9f880..1b684da2cf 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -27,7 +27,6 @@ cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 -infill_overlap_mm = 0 infill_pattern = cubic infill_wipe_dist = 0 jerk_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 49ef6d91ec..36c17c1c58 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -27,7 +27,6 @@ cool_min_layer_time_fan_speed_max = 6 cool_min_speed = 20 infill_line_width = =round(line_width * 0.8 / 0.76, 2) infill_overlap = 0 -infill_overlap_mm = 0 infill_pattern = cubic infill_wipe_dist = 0 jerk_enabled = True From b58abc91b32cca47d904c63a79addf236cbe621c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 26 Jun 2017 11:49:18 +0200 Subject: [PATCH 124/379] Fixed names of 2 pp profiles CURA-3960 --- resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index 8f54bf4b4e..b3c033a5a2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast +name = Normal definition = ultimaker2_plus [metadata] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 1b684da2cf..b87823e4fa 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = Fast Print +name = Fast definition = ultimaker2_plus [metadata] From 4ceb9f95cc5381e518fa26c43272106e92ba6149 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 26 Jun 2017 16:28:53 +0200 Subject: [PATCH 125/379] Fixed weights of a few profiles CURA-3845 --- .../quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index 72a280e97b..c6eca25b0d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = superdraft material = generic_cpe_plus_ultimaker3_AA_0.8 -weight = -2 +weight = -4 setting_version = 1 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index e34b1661ff..bb3cfbd9f4 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = verydraft material = generic_cpe_plus_ultimaker3_AA_0.8 -weight = -1 +weight = -3 setting_version = 1 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg index 182684087a..ad7306ed13 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = superdraft material = generic_cpe_ultimaker3_AA_0.8 -weight = -2 +weight = -4 setting_version = 1 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg index 189d64b5bb..f3ce457682 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker3 type = quality quality_type = verydraft material = generic_cpe_ultimaker3_AA_0.8 -weight = -2 +weight = -3 setting_version = 1 [values] From 36cc21d31bd24220bfe859f59a722079be6363d2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 26 Jun 2017 17:20:59 +0200 Subject: [PATCH 126/379] Rename Polypropylene to PP They changed their mind. Contributes to issue CURA-3960. --- resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg index 5aa4b0d253..8b5f0aa085 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = draft -material = generic_polypropylene_ultimaker3_AA_0.4 +material = generic_pp_ultimaker3_AA_0.4 weight = -2 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg index 1f0fa009ba..de78433c78 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = fast -material = generic_polypropylene_ultimaker3_AA_0.4 +material = generic_pp_ultimaker3_AA_0.4 weight = -1 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg index 5e18949534..c15d2a4f49 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = normal -material = generic_polypropylene_ultimaker3_AA_0.4 +material = generic_pp_ultimaker3_AA_0.4 weight = 0 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index 9124425312..e81a99b83d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = draft -material = generic_polypropylene_ultimaker3_AA_0.8 +material = generic_pp_ultimaker3_AA_0.8 weight = -2 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index d122d40294..2e23333042 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = superdraft -material = generic_polypropylene_ultimaker3_AA_0.8 +material = generic_pp_ultimaker3_AA_0.8 weight = -4 setting_version = 1 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index 09e12d0d7a..a0e643c5b5 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] type = quality quality_type = verydraft -material = generic_polypropylene_ultimaker3_AA_0.8 +material = generic_pp_ultimaker3_AA_0.8 weight = -3 setting_version = 1 From a8da2407c74e996f6fe77c6f17e176b68b24598a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 08:44:28 +0200 Subject: [PATCH 127/379] Fix link to pp instead of polypropylene The material profile was renamed but that wasn't put through here. Contributes to issue CURA-3960. --- resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg | 2 +- .../quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index 599c6f8d28..d174711666 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -5,7 +5,7 @@ definition = ultimaker2_plus [metadata] type = quality -material = generic_polypropylene_ultimaker2_plus_0.4_mm +material = generic_pp_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast setting_version = 1 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index cd5385e521..af99ae18b0 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -5,7 +5,7 @@ definition = ultimaker2_plus [metadata] type = quality -material = generic_polypropylene_ultimaker2_plus_0.4_mm +material = generic_pp_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal setting_version = 1 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index d232ab24a3..9279a752a2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -5,7 +5,7 @@ definition = ultimaker2_plus [metadata] type = quality -material = generic_polypropylene_ultimaker2_plus_0.6_mm +material = generic_pp_ultimaker2_plus_0.6_mm weight = -2 quality_type = draft setting_version = 1 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index b3c033a5a2..b9f07460c6 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -5,7 +5,7 @@ definition = ultimaker2_plus [metadata] type = quality -material = generic_polypropylene_ultimaker2_plus_0.6_mm +material = generic_pp_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast setting_version = 1 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index b87823e4fa..40650f71d6 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -5,7 +5,7 @@ definition = ultimaker2_plus [metadata] type = quality -material = generic_polypropylene_ultimaker2_plus_0.8_mm +material = generic_pp_ultimaker2_plus_0.8_mm weight = -2 quality_type = fast setting_version = 1 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 36c17c1c58..11e7c0b08d 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -5,7 +5,7 @@ definition = ultimaker2_plus [metadata] type = quality -material = generic_polypropylene_ultimaker2_plus_0.8_mm +material = generic_pp_ultimaker2_plus_0.8_mm weight = -3 quality_type = draft setting_version = 1 From 264e09bdafc185554bcfa5ca8208bd8cbb521ff4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 08:47:22 +0200 Subject: [PATCH 128/379] Update Japanese translations These have not been tested or even opened yet at this point, but by the time I've pushed the commit they will be. This should fix the missing translation and inconsistent wording. Contributes to issue CURA-3950. --- resources/i18n/jp/fdmextruder.def.json.po | 2 +- resources/i18n/jp/fdmprinter.def.json.po | 52 +++++++++++------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/resources/i18n/jp/fdmextruder.def.json.po b/resources/i18n/jp/fdmextruder.def.json.po index a6dc6e2e54..6a29057028 100644 --- a/resources/i18n/jp/fdmextruder.def.json.po +++ b/resources/i18n/jp/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-06-19 15:44+0900\n" +"PO-Revision-Date: 2017-06-26 17:30+0900\n" "Last-Translator: None\n" "Language-Team: None\n" "Language: ja\n" diff --git a/resources/i18n/jp/fdmprinter.def.json.po b/resources/i18n/jp/fdmprinter.def.json.po index 333075b2e2..33eabe895c 100644 --- a/resources/i18n/jp/fdmprinter.def.json.po +++ b/resources/i18n/jp/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 2.6\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-05-30 15:32+0000\n" -"PO-Revision-Date: 2017-06-19 15:44+0900\n" +"PO-Revision-Date: 2017-06-26 17:52+0900\n" "Last-Translator: None\n" "Language-Team: None\n" "Language: ja\n" @@ -686,7 +686,7 @@ msgstr "Support Interface Line Width" #: fdmprinter.def.json msgctxt "support_interface_line_width description" msgid "Width of a single line of support roof or floor." -msgstr "サポートの屋根、フロアのライン幅" +msgstr "サポートのルーフ、フロアのライン幅" #: fdmprinter.def.json msgctxt "support_roof_line_width label" @@ -696,7 +696,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_line_width description" msgid "Width of a single support roof line." -msgstr "天井のサポートのライン幅。" +msgstr "サポートルーフのライン幅。" #: fdmprinter.def.json msgctxt "support_bottom_line_width label" @@ -706,7 +706,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_line_width description" msgid "Width of a single support floor line." -msgstr "サポートの底面のラインの幅。" +msgstr "サポートのフロアのラインの幅。" #: fdmprinter.def.json msgctxt "prime_tower_line_width label" @@ -1713,7 +1713,7 @@ msgstr "Support Interface Speed" #: fdmprinter.def.json msgctxt "speed_support_interface description" msgid "The speed at which the roofs and floors of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "天井と底面のサポート材をプリントする速度。低速でプリントするとオーバーハングの品質を向上できます。" +msgstr "ルーフとフロアのサポート材をプリントする速度。低速でプリントするとオーバーハングの品質を向上できます。" #: fdmprinter.def.json msgctxt "speed_support_roof label" @@ -1723,7 +1723,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_roof description" msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "天井と底面のサポート材をプリントする速度 これらを低速でプリントするとオーバーハングの品質を向上できます" +msgstr "ルーフとフロアのサポート材をプリントする速度 これらを低速でプリントするとオーバーハングの品質を向上できます" #: fdmprinter.def.json msgctxt "speed_support_bottom label" @@ -1733,7 +1733,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "speed_support_bottom description" msgid "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model." -msgstr "底面のサポートがプリントされる速度。低速で印刷することで、サポートの接着性を向上させることができます。" +msgstr "フロアのサポートがプリントされる速度。低速で印刷することで、サポートの接着性を向上させることができます。" #: fdmprinter.def.json msgctxt "speed_prime_tower label" @@ -1953,7 +1953,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "acceleration_support_bottom description" msgid "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model." -msgstr "サポートの底面が印刷される加速度。より低い加速度で印刷すると、モデル上のサポートの接着性を向上させることができます。" +msgstr "サポートのフロアが印刷される加速度。より低い加速度で印刷すると、モデル上のサポートの接着性を向上させることができます。" #: fdmprinter.def.json msgctxt "acceleration_prime_tower label" @@ -2113,7 +2113,7 @@ msgstr "Support Interface Jerk" #: fdmprinter.def.json msgctxt "jerk_support_interface description" msgid "The maximum instantaneous velocity change with which the roofs and floors of support are printed." -msgstr "どの天井と底面のサポート部分を印刷するかによって最大瞬間速度は変化します。" +msgstr "どのルーフとフロアのサポート部分を印刷するかによって最大瞬間速度は変化します。" #: fdmprinter.def.json msgctxt "jerk_support_roof label" @@ -2123,7 +2123,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_roof description" msgid "The maximum instantaneous velocity change with which the roofs of support are printed." -msgstr "どのサポートの屋根部分を印刷するかによって最大瞬間速度は変化します。" +msgstr "どのサポートのルーフ部分を印刷するかによって最大瞬間速度は変化します。" #: fdmprinter.def.json msgctxt "jerk_support_bottom label" @@ -2133,7 +2133,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" msgid "The maximum instantaneous velocity change with which the floors of support are printed." -msgstr "どのサポートの底面部分を印刷するかによって最大瞬間速度は変化します。" +msgstr "どのサポートのフロア部分を印刷するかによって最大瞬間速度は変化します。" #: fdmprinter.def.json msgctxt "jerk_prime_tower label" @@ -2511,7 +2511,7 @@ msgstr "Support Interface Extruder" #: fdmprinter.def.json msgctxt "support_interface_extruder_nr description" msgid "The extruder train to use for printing the roofs and floors of the support. This is used in multi-extrusion." -msgstr "サポートの天井および底面を印刷するために使用するエクストルーダーの列。デュアルノズル時に使用されます。" +msgstr "サポートのルーフおよび底面を印刷するために使用するエクストルーダーの列。デュアルノズル時に使用されます。" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr label" @@ -2521,7 +2521,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr description" msgid "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion." -msgstr "サポートの天井面をプリントする際のエクストルーダー列。デュアルノズル時に使用します。" +msgstr "サポートのルーフ面をプリントする際のエクストルーダー列。デュアルノズル時に使用します。" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr label" @@ -2531,7 +2531,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr description" msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion." -msgstr "サポートの底面をプリントする際に使用するエクストルーダーの列。デュアルノズル時に使用します。" +msgstr "サポートのフロア面をプリントする際に使用するエクストルーダーの列。デュアルノズル時に使用します。" #: fdmprinter.def.json msgctxt "support_type label" @@ -2791,7 +2791,7 @@ msgstr "Support Roof Thickness" #: fdmprinter.def.json msgctxt "support_roof_height description" msgid "The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests." -msgstr "サポートの屋根の厚さ。これは、モデルの下につくサポートの上部にある密度の量を制御します。" +msgstr "サポートのルーフの厚さ。これは、モデルの下につくサポートの上部にある密度の量を制御します。" #: fdmprinter.def.json msgctxt "support_bottom_height label" @@ -2821,7 +2821,7 @@ msgstr "Support Interface Density" #: fdmprinter.def.json msgctxt "support_interface_density description" msgid "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "サポート材の屋根と底部の密度を調整します 大きな値ではオーバーハングでの成功率があがりますが、サポート材が除去しにくくなります" +msgstr "サポート材のルーフとフロアの密度を調整します 大きな値ではオーバーハングでの成功率があがりますが、サポート材が除去しにくくなります" #: fdmprinter.def.json msgctxt "support_roof_density label" @@ -2831,7 +2831,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_density description" msgid "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "サポート材の屋根の部分の密度を調整します 大きな値ではオーバーハングの成功率があがりますが、サポート材が除去しにくくなります。" +msgstr "サポート材のルーフの部分の密度を調整します 大きな値ではオーバーハングの成功率があがりますが、サポート材が除去しにくくなります。" #: fdmprinter.def.json msgctxt "support_roof_line_distance label" @@ -2851,7 +2851,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_density description" msgid "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model." -msgstr "サポート構造の底面の密度です。高い値は、サポートのよりよい接着を促します。" +msgstr "サポート構造のフロアの密度です。高い値は、サポートのよりよい接着を促します。" #: fdmprinter.def.json msgctxt "support_bottom_line_distance label" @@ -2861,7 +2861,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_line_distance description" msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." -msgstr "印刷されたサポートの底面のライン間の距離。この設定は、密度によって計算されますが、個別に調整することもできます。" +msgstr "印刷されたサポートのフロアのライン間の距離。この設定は、密度によって計算されますが、個別に調整することもできます。" #: fdmprinter.def.json msgctxt "support_interface_pattern label" @@ -2911,7 +2911,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." -msgstr "サポートの天井が印刷されるパターン" +msgstr "サポートのルーフが印刷されるパターン" #: fdmprinter.def.json msgctxt "support_roof_pattern option lines" @@ -2951,7 +2951,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "support_bottom_pattern description" msgid "The pattern with which the floors of the support are printed." -msgstr "サポートの底面が印刷されるパターン" +msgstr "サポートのフロアが印刷されるパターン。" #: fdmprinter.def.json msgctxt "support_bottom_pattern option lines" @@ -2991,7 +2991,7 @@ msgstr "Use Towers" #: fdmprinter.def.json msgctxt "support_use_towers description" msgid "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof." -msgstr "特殊なタワーを使用して、小さなオーバーハングしているエリアをサポートします。これらの塔は、サポートできる領域より大きな直径を支えれます。オーバーハング付近では塔の直径が減少し、屋根を形成します。" +msgstr "特殊なタワーを使用して、小さなオーバーハングしているエリアをサポートします。これらの塔は、サポートできる領域より大きな直径を支えれます。オーバーハング付近では塔の直径が減少し、ルーフを形成します。" #: fdmprinter.def.json msgctxt "support_tower_diameter label" @@ -3838,7 +3838,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "smooth_spiralized_contours description" msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details." -msgstr "" +msgstr "らせん状の輪郭を滑らかにしてZシームの視認性を低下させます(Zシームは印刷物上でほとんどみえませんが、レイヤービューでは確認できます。)スムージングは​​細かいサーフェスの詳細をぼかす傾向があることに注意してください。" #: fdmprinter.def.json msgctxt "experimental label" @@ -4088,7 +4088,7 @@ msgstr "WP Roof Inset Distance" #: fdmprinter.def.json msgctxt "wireframe_roof_inset description" msgid "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing." -msgstr "屋根から内側に輪郭を描くときの距離。ワイヤ印刷のみに適用されます。" +msgstr "ルーフから内側に輪郭を描くときの距離。ワイヤ印刷のみに適用されます。" #: fdmprinter.def.json msgctxt "wireframe_printspeed label" @@ -4285,7 +4285,7 @@ msgstr "WP Roof Fall Down" #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down description" msgid "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing." -msgstr "水平屋根が ”薄い空気”に印刷され落ちる距離。この距離は補正されています。ワイヤ印刷に適用されます。" +msgstr "水平ルーフが ”薄い空気”に印刷され落ちる距離。この距離は補正されています。ワイヤ印刷に適用されます。" #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along label" @@ -4295,7 +4295,7 @@ msgstr "WP Roof Drag Along" #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along description" msgid "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing." -msgstr "屋根の外側の輪郭に戻る際に引きずる内側ラインの終わり部分の距離。この距離は補正されていてワイヤ印刷のみ適用されます。" +msgstr "ルーフの外側の輪郭に戻る際に引きずる内側ラインの終わり部分の距離。この距離は補正されていてワイヤ印刷のみ適用されます。" #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay label" From ca7992875a865f17d11f094ee6365771cbf81e00 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 09:32:17 +0200 Subject: [PATCH 129/379] Add 'Not Supported' profile for Polypropylene 0.25mm Previously we also called the ID 'Not Supported' but we decided against that for new profiles, since that would mean that if the profile ever becomes supported we'd have to do a rename of the user's file names in their settings via a version upgrade. So now the ID is as if it's supported but the user-visible name still says that it's Not Supported and the profile still becomes orange. Contributes to issue CURA-3960. --- .../ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg new file mode 100644 index 0000000000..864381cfa2 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_pp_ultimaker2_plus_0.25_mm +weight = 0 +quality_type = normal +setting_version = 1 +supported = False + +[values] From 66f23aa2e1ff3d56acd00e14de529501005bc865 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 22 Jun 2017 14:38:59 +0200 Subject: [PATCH 130/379] fix: copy global settings into extruder msessage for SE (CURA-3930) --- plugins/CuraEngineBackend/StartSliceJob.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index b262080872..bb834324a8 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -154,6 +154,8 @@ class StartSliceJob(Job): if stack.getProperty("machine_extruder_count", "value") > 1: for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): self._buildExtruderMessage(extruder_stack) + else: + self._buildExtruderMessageFromGlobalStack(stack) for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") @@ -226,6 +228,19 @@ class StartSliceJob(Job): setting.value = str(stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread() + ## Create extruder message from global stack + def _buildExtruderMessageFromGlobalStack(self, stack): + message = self._slice_message.addRepeatedMessage("extruders") + + for key in stack.getAllKeys(): + # Do not send settings that are not settable_per_extruder. + if stack.getProperty(key, "settable_per_extruder") == False: + continue + setting = message.getMessage("settings").addRepeatedMessage("settings") + setting.name = key + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() + ## Sends all global settings to the engine. # # The settings are taken from the global stack. This does not include any From d30c59897712ee810e5d30b50353b7a10633025a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Jun 2017 12:49:31 +0200 Subject: [PATCH 131/379] Fix code style CURA-3930 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index bb834324a8..fdbee36a57 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -234,7 +234,7 @@ class StartSliceJob(Job): for key in stack.getAllKeys(): # Do not send settings that are not settable_per_extruder. - if stack.getProperty(key, "settable_per_extruder") == False: + if not stack.getProperty(key, "settable_per_extruder"): continue setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key From cb4e58c6f715336a5da85efc1ceb6b7c7d762803 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 11:01:03 +0200 Subject: [PATCH 132/379] Increase the maximum warning for speed_slowdown_layers Also round the resolved value, because the result needs to be an integer. Contributes to issue CURA-3960. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bf28566f27..b8b5e841c0 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2046,9 +2046,9 @@ "description": "The first few layers are printed slower than the rest of the model, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.", "type": "int", "default_value": 2, - "resolve": "sum(extruderValues('speed_slowdown_layers')) / len(extruderValues('speed_slowdown_layers'))", + "resolve": "round(sum(extruderValues('speed_slowdown_layers')) / len(extruderValues('speed_slowdown_layers')))", "minimum_value": "0", - "maximum_value_warning": "1.0 / resolveOrValue('layer_height')", + "maximum_value_warning": "3.0 / resolveOrValue('layer_height')", "settable_per_mesh": false, "settable_per_extruder": false }, From c66740d8e45fbe8b5138d91244ec504fa038ebd6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 13:23:30 +0200 Subject: [PATCH 133/379] Increase warning value for Number of Slower Layers further Because it was still giving a warning for the 0.4mm layer height profile. Contributes to issue CURA-3960. --- 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 b8b5e841c0..99f55569d5 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2048,7 +2048,7 @@ "default_value": 2, "resolve": "round(sum(extruderValues('speed_slowdown_layers')) / len(extruderValues('speed_slowdown_layers')))", "minimum_value": "0", - "maximum_value_warning": "3.0 / resolveOrValue('layer_height')", + "maximum_value_warning": "3.2 / resolveOrValue('layer_height')", "settable_per_mesh": false, "settable_per_extruder": false }, From df2ec7bd734b9e389f9a8472455a374b2cc43f6e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 14:02:35 +0200 Subject: [PATCH 134/379] Don't try to activate a machine that we don't have a definition for Contributes to issue CURA-3973. --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index d0c04cd26a..1c47e9967a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -91,7 +91,7 @@ class MachineManager(QObject): self._printer_output_devices = [] Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) - if active_machine_id != "": + if active_machine_id != "" and ContainerRegistry.getInstance().findDefinitionContainers(id = active_machine_id): # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) if self._global_container_stack and self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: From b2b9b1bedea3f71a18348e8beed8327bd2cc026c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 15:14:26 +0200 Subject: [PATCH 135/379] Fix checking if container stack exists It was checking a container stack ID against the definition containers, which doesn't match. Contributes to issue CURA-3973. --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1c47e9967a..cead5ad4f7 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -91,7 +91,7 @@ class MachineManager(QObject): self._printer_output_devices = [] Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) - if active_machine_id != "" and ContainerRegistry.getInstance().findDefinitionContainers(id = active_machine_id): + if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacks(id = active_machine_id): # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) if self._global_container_stack and self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: From 4370e3a13cf66fc8ee8865b09f0f2a8aced49019 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 27 Jun 2017 15:41:17 +0200 Subject: [PATCH 136/379] Added zoom to mouse preference https://github.com/Ultimaker/Cura/issues/1572 --- resources/qml/Preferences/GeneralPage.qml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 59f546279b..92a768051e 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -86,6 +86,8 @@ UM.PreferencesPage centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) UM.Preferences.resetPreference("view/invert_zoom"); invertZoomCheckbox.checked = boolCheck(UM.Preferences.getValue("view/invert_zoom")) + UM.Preferences.resetPreference("view/zoom_to_mouse"); + zoomToMouseCheckbox.checked = boolCheck(UM.Preferences.getValue("view/zoom_to_mouse")) UM.Preferences.resetPreference("view/top_layer_count"); topLayerCountCheckbox.checked = boolCheck(UM.Preferences.getValue("view/top_layer_count")) @@ -354,6 +356,20 @@ UM.PreferencesPage } } + UM.TooltipArea { + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip", "Should zooming move in the direction of the mouse?") + + CheckBox + { + id: zoomToMouseCheckbox + text: catalog.i18nc("@action:button","Zoom toward mouse direction"); + checked: boolCheck(UM.Preferences.getValue("view/zoom_to_mouse")) + onClicked: UM.Preferences.setValue("view/zoom_to_mouse", checked) + } + } + UM.TooltipArea { width: childrenRect.width height: childrenRect.height From f30d150ead8fd93d684ee5ce7ce44295e315cf3a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 16:13:47 +0200 Subject: [PATCH 137/379] Rename CPE+ and PC draft prints to Not Supported It's a hack. But it prevents having to write an upgrade script for this. Contributes to issue CURA-3973. --- ...int.inst.cfg => um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg} | 0 ...Print.inst.cfg => um3_aa0.8_PC_Not_Supported_Quality.inst.cfg} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename resources/quality/ultimaker3/{um3_aa0.8_CPEP_Draft_Print.inst.cfg => um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PC_Draft_Print.inst.cfg => um3_aa0.8_PC_Not_Supported_Quality.inst.cfg} (100%) diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_CPEP_Draft_Print.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PC_Draft_Print.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg From ebdcd460627a7e9653c988f4eadc8c2c4e2e7f24 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 27 Jun 2017 16:41:58 +0200 Subject: [PATCH 138/379] Rename other quality profiles to old not-supported names The Superdraft quality was sometimes still active in users' old configuration as well. Contributes to issue CURA-3973. --- ...g => um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg} | 0 ...fg => um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg} | 0 ...cfg => um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg} | 0 ....cfg => um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename resources/quality/ultimaker3/{um3_aa0.8_CPEP_Superdraft_Print.inst.cfg => um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_CPEP_Verydraft_Print.inst.cfg => um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PC_Superdraft_Print.inst.cfg => um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PC_Verydraft_Print.inst.cfg => um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg} (100%) diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg From fb1d7bc22363d3a3550748c1180d43ceba444ff0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 28 Jun 2017 09:23:14 +0200 Subject: [PATCH 139/379] Fix direction of Y-offset in disallowed areas The front end has inverted Y with respect to the g-code. The prime position was correctly inverted but the nozzle offset wasn't. --- cura/BuildVolume.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 4963df65cd..33927c4a98 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -677,7 +677,7 @@ class BuildVolume(SceneNode): for extruder in used_extruders: prime_blob_enabled = extruder.getProperty("prime_blob_enable", "value") prime_x = extruder.getProperty("extruder_prime_pos_x", "value") - prime_y = - extruder.getProperty("extruder_prime_pos_y", "value") + prime_y = -extruder.getProperty("extruder_prime_pos_y", "value") #Ignore extruder prime position if it is not set or if blob is disabled if (prime_x == 0 and prime_y == 0) or not prime_blob_enabled: @@ -727,7 +727,7 @@ class BuildVolume(SceneNode): offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") if offset_x is None: offset_x = 0 - offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") + offset_y = -extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 result[extruder_id] = [] @@ -746,7 +746,7 @@ class BuildVolume(SceneNode): #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") - other_offset_y = other_extruder.getProperty("machine_nozzle_offset_y", "value") + other_offset_y = -other_extruder.getProperty("machine_nozzle_offset_y", "value") left_unreachable_border = min(left_unreachable_border, other_offset_x - offset_x) right_unreachable_border = max(right_unreachable_border, other_offset_x - offset_x) top_unreachable_border = min(top_unreachable_border, other_offset_y - offset_y) From 39cb68bd303e4c55585a9f115f6a3804dc11a3eb Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 28 Jun 2017 11:41:51 +0200 Subject: [PATCH 140/379] Update convex hull to account for first layer horizontal expansion --- cura/ConvexHullDecorator.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index 51b22755dd..70f77d9712 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -257,7 +257,11 @@ class ConvexHullDecorator(SceneNodeDecorator): # \return New Polygon instance that is offset with everything that # influences the collision area. def _offsetHull(self, convex_hull): - horizontal_expansion = self._getSettingProperty("xy_offset", "value") + horizontal_expansion = max( + self._getSettingProperty("xy_offset", "value"), + self._getSettingProperty("xy_offset_layer_0", "value") + ) + mold_width = 0 if self._getSettingProperty("mold_enabled", "value"): mold_width = self._getSettingProperty("mold_width", "value") @@ -332,4 +336,4 @@ class ConvexHullDecorator(SceneNodeDecorator): ## Settings that change the convex hull. # # If these settings change, the convex hull should be recalculated. - _influencing_settings = {"xy_offset", "mold_enabled", "mold_width"} + _influencing_settings = {"xy_offset", "xy_offset_layer_0", "mold_enabled", "mold_width"} From 20b2a3dc81a0eef118e041e1689eeff3e838ee59 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 28 Jun 2017 11:48:16 +0200 Subject: [PATCH 141/379] Improve description for xy_offset_layer_0 --- 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 88cbc6dd48..04091194f6 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1139,7 +1139,7 @@ "xy_offset_layer_0": { "label": "Initial Layer Horizontal Expansion", - "description": "Amount of offset applied to all polygons in the first layer. A negative value can compensate for elephants foot.", + "description": "Amount of offset applied to all polygons in the first layer. A negative value can compensate for squishing of the first layer known as \"elephant's foot\".", "unit": "mm", "type": "float", "minimum_value_warning": "-1", From 2a593e316b93e9aabc581bb6c3e96fc0a3d36e28 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 28 Jun 2017 11:49:07 +0200 Subject: [PATCH 142/379] Close camera upon disconnecting instead of relying on Uranium to do that Uranium shouldn't know about no camera. --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 18bf22d18d..2a9dedc20c 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -188,9 +188,18 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): else: self._updatePrinterType("unknown") + Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + def _onNetworkAccesibleChanged(self, accessible): Logger.log("d", "Network accessible state changed to: %s", accessible) + ## Triggered when the output device manager changes devices. + # + # This is how we can detect that our device is no longer active now. + def _onOutputDevicesChanged(self): + if self.getId() not in Application.getInstance().getOutputDeviceManager().getOutputDeviceIds(): + self.stopCamera() + def _onAuthenticationTimer(self): self._authentication_counter += 1 self._authentication_requested_message.setProgress(self._authentication_counter / self._max_authentication_counter * 100) From cd4bffb3800a7831953173b67fb64c0153432372 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 28 Jun 2017 13:50:37 +0200 Subject: [PATCH 143/379] Set author to Ultimaker B.V. instead of Ultimaker To be consistent with the rest of the plug-ins and with the material files. Contributes to issue CURA-3857. --- plugins/3MFReader/plugin.json | 2 +- plugins/3MFWriter/plugin.json | 2 +- plugins/AutoSave/plugin.json | 2 +- plugins/ChangeLogPlugin/plugin.json | 2 +- plugins/CuraEngineBackend/plugin.json | 2 +- plugins/CuraProfileReader/plugin.json | 2 +- plugins/CuraProfileWriter/plugin.json | 2 +- plugins/GCodeProfileReader/plugin.json | 2 +- plugins/GCodeWriter/plugin.json | 2 +- plugins/ImageReader/plugin.json | 2 +- plugins/LayerView/plugin.json | 2 +- plugins/LegacyProfileReader/plugin.json | 2 +- plugins/PerObjectSettingsTool/plugin.json | 2 +- plugins/PluginBrowser/plugin.json | 2 +- plugins/RemovableDriveOutputDevice/plugin.json | 2 +- plugins/SliceInfoPlugin/plugin.json | 2 +- plugins/SolidView/plugin.json | 2 +- plugins/UM3NetworkPrinting/plugin.json | 2 +- plugins/USBPrinting/plugin.json | 2 +- plugins/UltimakerMachineActions/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json | 2 +- plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json | 2 +- plugins/XRayView/plugin.json | 2 +- plugins/XmlMaterialProfile/plugin.json | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/plugins/3MFReader/plugin.json b/plugins/3MFReader/plugin.json index 1d9dadfaab..5d15123017 100644 --- a/plugins/3MFReader/plugin.json +++ b/plugins/3MFReader/plugin.json @@ -1,6 +1,6 @@ { "name": "3MF Reader", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides support for reading 3MF files.", "api": 4, diff --git a/plugins/3MFWriter/plugin.json b/plugins/3MFWriter/plugin.json index cd782c270a..22d18b2cf1 100644 --- a/plugins/3MFWriter/plugin.json +++ b/plugins/3MFWriter/plugin.json @@ -1,6 +1,6 @@ { "name": "3MF Writer", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides support for writing 3MF files.", "api": 4, diff --git a/plugins/AutoSave/plugin.json b/plugins/AutoSave/plugin.json index 6b1c5af4be..32e07a1062 100644 --- a/plugins/AutoSave/plugin.json +++ b/plugins/AutoSave/plugin.json @@ -1,6 +1,6 @@ { "name": "Auto Save", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Automatically saves Preferences, Machines and Profiles after changes.", "api": 4, diff --git a/plugins/ChangeLogPlugin/plugin.json b/plugins/ChangeLogPlugin/plugin.json index d200394182..e9414b9b71 100644 --- a/plugins/ChangeLogPlugin/plugin.json +++ b/plugins/ChangeLogPlugin/plugin.json @@ -1,6 +1,6 @@ { "name": "Changelog", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Shows changes since latest checked version.", "api": 4, diff --git a/plugins/CuraEngineBackend/plugin.json b/plugins/CuraEngineBackend/plugin.json index ae9e664bdc..e5df06f228 100644 --- a/plugins/CuraEngineBackend/plugin.json +++ b/plugins/CuraEngineBackend/plugin.json @@ -1,6 +1,6 @@ { "name": "CuraEngine Backend", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "description": "Provides the link to the CuraEngine slicing backend.", "api": 4, "version": "1.0.0", diff --git a/plugins/CuraProfileReader/plugin.json b/plugins/CuraProfileReader/plugin.json index 3dd003715b..004a1ade4d 100644 --- a/plugins/CuraProfileReader/plugin.json +++ b/plugins/CuraProfileReader/plugin.json @@ -1,6 +1,6 @@ { "name": "Cura Profile Reader", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides support for importing Cura profiles.", "api": 4, diff --git a/plugins/CuraProfileWriter/plugin.json b/plugins/CuraProfileWriter/plugin.json index 23d4322556..d9accce770 100644 --- a/plugins/CuraProfileWriter/plugin.json +++ b/plugins/CuraProfileWriter/plugin.json @@ -1,6 +1,6 @@ { "name": "Cura Profile Writer", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides support for exporting Cura profiles.", "api": 4, diff --git a/plugins/GCodeProfileReader/plugin.json b/plugins/GCodeProfileReader/plugin.json index dbbf4ee931..8111bc687c 100644 --- a/plugins/GCodeProfileReader/plugin.json +++ b/plugins/GCodeProfileReader/plugin.json @@ -1,6 +1,6 @@ { "name": "GCode Profile Reader", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides support for importing profiles from g-code files.", "api": 4, diff --git a/plugins/GCodeWriter/plugin.json b/plugins/GCodeWriter/plugin.json index d98d9426f2..5788b01375 100644 --- a/plugins/GCodeWriter/plugin.json +++ b/plugins/GCodeWriter/plugin.json @@ -1,6 +1,6 @@ { "name": "GCode Writer", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Writes GCode to a file.", "api": 4, diff --git a/plugins/ImageReader/plugin.json b/plugins/ImageReader/plugin.json index f8dcb8e91c..2752c6e8f4 100644 --- a/plugins/ImageReader/plugin.json +++ b/plugins/ImageReader/plugin.json @@ -1,6 +1,6 @@ { "name": "Image Reader", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Enables ability to generate printable geometry from 2D image files.", "api": 4, diff --git a/plugins/LayerView/plugin.json b/plugins/LayerView/plugin.json index 979359a002..232fe9c361 100644 --- a/plugins/LayerView/plugin.json +++ b/plugins/LayerView/plugin.json @@ -1,6 +1,6 @@ { "name": "Layer View", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides the Layer view.", "api": 4, diff --git a/plugins/LegacyProfileReader/plugin.json b/plugins/LegacyProfileReader/plugin.json index 6f08bb2ab0..2dc71511a9 100644 --- a/plugins/LegacyProfileReader/plugin.json +++ b/plugins/LegacyProfileReader/plugin.json @@ -1,6 +1,6 @@ { "name": "Legacy Cura Profile Reader", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides support for importing profiles from legacy Cura versions.", "api": 4, diff --git a/plugins/PerObjectSettingsTool/plugin.json b/plugins/PerObjectSettingsTool/plugin.json index 1eba8aff65..3254662d33 100644 --- a/plugins/PerObjectSettingsTool/plugin.json +++ b/plugins/PerObjectSettingsTool/plugin.json @@ -1,6 +1,6 @@ { "name": "Per Model Settings Tool", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides the Per Model Settings.", "api": 4, diff --git a/plugins/PluginBrowser/plugin.json b/plugins/PluginBrowser/plugin.json index 1447445e95..491e21f506 100644 --- a/plugins/PluginBrowser/plugin.json +++ b/plugins/PluginBrowser/plugin.json @@ -1,6 +1,6 @@ { "name": "Plugin Browser", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "api": 4, "description": "Find, manage and install new plugins." diff --git a/plugins/RemovableDriveOutputDevice/plugin.json b/plugins/RemovableDriveOutputDevice/plugin.json index bdae36d6cb..df11644256 100644 --- a/plugins/RemovableDriveOutputDevice/plugin.json +++ b/plugins/RemovableDriveOutputDevice/plugin.json @@ -1,6 +1,6 @@ { "name": "Removable Drive Output Device Plugin", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "description": "Provides removable drive hotplugging and writing support.", "version": "1.0.0", "api": 4, diff --git a/plugins/SliceInfoPlugin/plugin.json b/plugins/SliceInfoPlugin/plugin.json index 7c9538b679..d1c643266b 100644 --- a/plugins/SliceInfoPlugin/plugin.json +++ b/plugins/SliceInfoPlugin/plugin.json @@ -1,6 +1,6 @@ { "name": "Slice info", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Submits anonymous slice info. Can be disabled through preferences.", "api": 4, diff --git a/plugins/SolidView/plugin.json b/plugins/SolidView/plugin.json index 22cd202489..6d6bda96f0 100644 --- a/plugins/SolidView/plugin.json +++ b/plugins/SolidView/plugin.json @@ -1,6 +1,6 @@ { "name": "Solid View", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides a normal solid mesh view.", "api": 4, diff --git a/plugins/UM3NetworkPrinting/plugin.json b/plugins/UM3NetworkPrinting/plugin.json index 30b6c153e6..5a845a0516 100644 --- a/plugins/UM3NetworkPrinting/plugin.json +++ b/plugins/UM3NetworkPrinting/plugin.json @@ -1,6 +1,6 @@ { "name": "UM3 Network Connection", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "description": "Manages network connections to Ultimaker 3 printers", "version": "1.0.0", "api": 4, diff --git a/plugins/USBPrinting/plugin.json b/plugins/USBPrinting/plugin.json index 600551a6dc..27e07c45b2 100644 --- a/plugins/USBPrinting/plugin.json +++ b/plugins/USBPrinting/plugin.json @@ -1,6 +1,6 @@ { "name": "USB printing", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "api": 4, "description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.", diff --git a/plugins/UltimakerMachineActions/plugin.json b/plugins/UltimakerMachineActions/plugin.json index 2c95d8e6fd..c9bb1a89e4 100644 --- a/plugins/UltimakerMachineActions/plugin.json +++ b/plugins/UltimakerMachineActions/plugin.json @@ -1,6 +1,6 @@ { "name": "Ultimaker machine actions", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)", "api": 4, diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json index 03c0e72f5c..79115f931e 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json @@ -1,6 +1,6 @@ { "name": "Version Upgrade 2.1 to 2.2", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Upgrades configurations from Cura 2.1 to Cura 2.2.", "api": 4, diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json index 204851f4e8..d213042ad2 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json @@ -1,6 +1,6 @@ { "name": "Version Upgrade 2.2 to 2.4", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Upgrades configurations from Cura 2.2 to Cura 2.4.", "api": 4, diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json index 3e5eb75eee..759b6368fd 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json @@ -1,6 +1,6 @@ { "name": "Version Upgrade 2.5 to 2.6", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Upgrades configurations from Cura 2.5 to Cura 2.6.", "api": 4, diff --git a/plugins/XRayView/plugin.json b/plugins/XRayView/plugin.json index 67f0d808f1..4e89690c13 100644 --- a/plugins/XRayView/plugin.json +++ b/plugins/XRayView/plugin.json @@ -1,6 +1,6 @@ { "name": "X-Ray View", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides the X-Ray view.", "api": 4, diff --git a/plugins/XmlMaterialProfile/plugin.json b/plugins/XmlMaterialProfile/plugin.json index 47897b7ad4..17056dcb3e 100644 --- a/plugins/XmlMaterialProfile/plugin.json +++ b/plugins/XmlMaterialProfile/plugin.json @@ -1,6 +1,6 @@ { "name": "Material Profiles", - "author": "Ultimaker", + "author": "Ultimaker B.V.", "version": "1.0.0", "description": "Provides capabilities to read and write XML-based material profiles.", "api": 4, From 45eb301f9b3e32f36b4fcfe2777bc3f9f177949d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 28 Jun 2017 13:55:45 +0200 Subject: [PATCH 144/379] Added the no-nozzle offset for all polygons CURA-3663 --- cura/BuildVolume.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 33927c4a98..353ef00040 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -731,9 +731,9 @@ class BuildVolume(SceneNode): if offset_y is None: offset_y = 0 result[extruder_id] = [] - - for polygon in machine_disallowed_polygons: - result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder. + if not no_nozzle_offsetting_for_disallowed_areas: + for polygon in machine_disallowed_polygons: + result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder. #Add the border around the edge of the build volume. left_unreachable_border = 0 From f79101709124490a6c8aff2ebe1cb31b4db4cba3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 28 Jun 2017 14:20:12 +0200 Subject: [PATCH 145/379] Revert "Added the no-nozzle offset for all polygons" This reverts commit 45eb301f9b3e32f36b4fcfe2777bc3f9f177949d. --- cura/BuildVolume.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 353ef00040..33927c4a98 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -731,9 +731,9 @@ class BuildVolume(SceneNode): if offset_y is None: offset_y = 0 result[extruder_id] = [] - if not no_nozzle_offsetting_for_disallowed_areas: - for polygon in machine_disallowed_polygons: - result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder. + + for polygon in machine_disallowed_polygons: + result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder. #Add the border around the edge of the build volume. left_unreachable_border = 0 From e9d2434c419ff3f546802f24bb4e1317bfde945e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 28 Jun 2017 15:35:13 +0200 Subject: [PATCH 146/379] Simplify text generaton for download button CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index be44ab854a..841a1828a2 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -88,7 +88,7 @@ UM.Dialog Button { id: downloadButton - text: !model.already_installed ? catalog.i18nc("@action:button", "Download") : model.can_upgrade ? catalog.i18nc("@action:button", "Upgrade") : catalog.i18nc("@action:button", "Download") + text: (model.already_installed && model.can_upgrade) ? catalog.i18nc("@action:button", "Upgrade") : catalog.i18nc("@action:button", "Download") onClicked: manager.downloadAndInstallPlugin(model.file_location) anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width From ab384ba8ec7b1e1ed7afd4e510f89d8eade6c94c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 28 Jun 2017 17:16:27 +0200 Subject: [PATCH 147/379] Rename and invert moving disallowed areas metadata property It's more easy semantically to invert this, to prevent the double negatives. Contributes to issue CURA-3663. --- cura/BuildVolume.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 33927c4a98..2ad3f4dda1 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -718,8 +718,8 @@ class BuildVolume(SceneNode): # For certain machines we don't need to compute disallowed areas for each nozzle. # So we check here and only do the nozzle offsetting if needed. - no_nozzle_offsetting_for_disallowed_areas = self._global_container_stack.getMetaDataEntry( - "no_nozzle_offsetting_for_disallowed_areas", False) + nozzle_offsetting_for_disallowed_areas = self._global_container_stack.getMetaDataEntry( + "nozzle_offsetting_for_disallowed_areas", True) result = {} for extruder in used_extruders: @@ -742,7 +742,7 @@ class BuildVolume(SceneNode): bottom_unreachable_border = 0 # Only do nozzle offsetting if needed - if not no_nozzle_offsetting_for_disallowed_areas: + if nozzle_offsetting_for_disallowed_areas: #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") From 13f3477288828b714dbddec8ab261ba7b4ebbab4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Jun 2017 10:15:29 +0200 Subject: [PATCH 148/379] Fixed crash when adding a single extrusion printer CURA-3980 --- cura/BuildVolume.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 33927c4a98..84f62f932a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -727,9 +727,11 @@ class BuildVolume(SceneNode): offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") if offset_x is None: offset_x = 0 - offset_y = -extruder.getProperty("machine_nozzle_offset_y", "value") + offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 + else: + offset_y = -offset_y result[extruder_id] = [] for polygon in machine_disallowed_polygons: From c7120dddda799cdb54f4624387edbfc04c3b6384 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 14:16:02 +0200 Subject: [PATCH 149/379] Don't allow changing the default printing temperature per mesh The printing temperature is not settable per mesh. The default printing temperature shouldn't be either. --- 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 a3642cf897..0760533f33 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1537,6 +1537,7 @@ "maximum_value_warning": "285", "enabled": "machine_nozzle_temp_enabled", "settable_per_extruder": true, + "settable_per_mesh": false, "minimum_value": "-273.15" }, "material_print_temperature": From abae2cc28c05ca5abc59249ad8c7e8fe51695300 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Jun 2017 14:52:10 +0200 Subject: [PATCH 150/379] Moved SliceInfoJob to it's own file CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 41 ++------------------- plugins/SliceInfoPlugin/SliceInfoJob.py | 47 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 plugins/SliceInfoPlugin/SliceInfoJob.py diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 50ca1dbd06..7abb218dab 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -1,6 +1,5 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from typing import Any from cura.CuraApplication import CuraApplication @@ -8,56 +7,22 @@ from UM.Extension import Extension from UM.Application import Application from UM.Preferences import Preferences from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Scene.SceneNode import SceneNode from UM.Message import Message from UM.i18n import i18nCatalog from UM.Logger import Logger -from UM.Platform import Platform + from UM.Qt.Duration import DurationFormat -from UM.Job import Job + +from .SliceInfoJob import SliceInfoJob import platform import math import urllib.request import urllib.parse -import ssl -import hashlib import json catalog = i18nCatalog("cura") -class SliceInfoJob(Job): - data = None # type: Any - url = None # type: str - - def __init__(self, url, data): - super().__init__() - self.url = url - self.data = data - - def run(self): - if not self.url or not self.data: - Logger.log("e", "URL or DATA for sending slice info was not set!") - return - - # Submit data - kwoptions = {"data" : self.data, - "timeout" : 5 - } - - if Platform.isOSX(): - kwoptions["context"] = ssl._create_unverified_context() - - Logger.log("d", "Sending anonymous slice info to [%s]...", self.url) - - try: - f = urllib.request.urlopen(self.url, **kwoptions) - Logger.log("i", "Sent anonymous slice info.") - f.close() - except urllib.error.HTTPError as http_exception: - Logger.log("e", "An HTTP error occurred while trying to send slice information: %s" % http_exception) - except Exception as e: # We don't want any exception to cause problems - Logger.log("e", "An exception occurred while trying to send slice information: %s" % e) ## This Extension runs in the background and sends several bits of information to the Ultimaker servers. # The data is only sent when the user in question gave permission to do so. All data is anonymous and diff --git a/plugins/SliceInfoPlugin/SliceInfoJob.py b/plugins/SliceInfoPlugin/SliceInfoJob.py new file mode 100644 index 0000000000..9944bc9e50 --- /dev/null +++ b/plugins/SliceInfoPlugin/SliceInfoJob.py @@ -0,0 +1,47 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + + +from UM.Job import Job +from UM.Logger import Logger +from UM.Platform import Platform + +import ssl +import urllib.request +import urllib.error + +from typing import Any + + +class SliceInfoJob(Job): + data = None # type: Any + url = None # type: str + + def __init__(self, url, data): + super().__init__() + self.url = url + self.data = data + + def run(self): + if not self.url or not self.data: + Logger.log("e", "URL or DATA for sending slice info was not set!") + return + + # Submit data + kwoptions = {"data" : self.data, + "timeout" : 5 + } + + if Platform.isOSX(): + kwoptions["context"] = ssl._create_unverified_context() + + Logger.log("d", "Sending anonymous slice info to [%s]...", self.url) + + try: + f = urllib.request.urlopen(self.url, **kwoptions) + Logger.log("i", "Sent anonymous slice info.") + f.close() + except urllib.error.HTTPError as http_exception: + Logger.log("e", "An HTTP error occurred while trying to send slice information: %s" % http_exception) + except Exception as e: # We don't want any exception to cause problems + Logger.log("e", "An exception occurred while trying to send slice information: %s" % e) \ No newline at end of file From 0f00895a97430d7db89440f186ad0d14609ed8a9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Jun 2017 14:57:19 +0200 Subject: [PATCH 151/379] Code cleanup CURA-3858 --- plugins/SliceInfoPlugin/SliceInfoJob.py | 29 +++++++++---------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfoJob.py b/plugins/SliceInfoPlugin/SliceInfoJob.py index 9944bc9e50..0ef390d058 100644 --- a/plugins/SliceInfoPlugin/SliceInfoJob.py +++ b/plugins/SliceInfoPlugin/SliceInfoJob.py @@ -1,7 +1,5 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. - - from UM.Job import Job from UM.Logger import Logger from UM.Platform import Platform @@ -10,38 +8,31 @@ import ssl import urllib.request import urllib.error -from typing import Any - class SliceInfoJob(Job): - data = None # type: Any - url = None # type: str - def __init__(self, url, data): super().__init__() - self.url = url - self.data = data + self._url = url + self._data = data def run(self): - if not self.url or not self.data: + if not self._url or not self._data: Logger.log("e", "URL or DATA for sending slice info was not set!") return # Submit data - kwoptions = {"data" : self.data, - "timeout" : 5 - } + kwoptions = {"data" : self._data, "timeout" : 5} if Platform.isOSX(): kwoptions["context"] = ssl._create_unverified_context() - Logger.log("d", "Sending anonymous slice info to [%s]...", self.url) + Logger.log("i", "Sending anonymous slice info to [%s]...", self._url) try: - f = urllib.request.urlopen(self.url, **kwoptions) + f = urllib.request.urlopen(self._url, **kwoptions) Logger.log("i", "Sent anonymous slice info.") f.close() - except urllib.error.HTTPError as http_exception: - Logger.log("e", "An HTTP error occurred while trying to send slice information: %s" % http_exception) - except Exception as e: # We don't want any exception to cause problems - Logger.log("e", "An exception occurred while trying to send slice information: %s" % e) \ No newline at end of file + except urllib.error.HTTPError: + Logger.logException("e", "An HTTP error occurred while trying to send slice information") + except Exception: # We don't want any exception to cause problems + Logger.logException("e", "An exception occurred while trying to send slice information") \ No newline at end of file From 8ae49c317cbd317cf96a0f90c7a7f37e23a4904d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 15:03:49 +0200 Subject: [PATCH 152/379] Emit metaDataChanged when changing properties Properties is a dictionary inside the metadata dictionary. If you change one of the properties, it'll check afterwards if the dictionary is different from what it was before, but since the dictionary is passed by reference all the time, it'll think that the dictionary didn't change: The reference is still the same, so the thing it checks against is updated along. This solution is a bit ugly but it does notice when the metadata changed inside the properties and then emits a change signal. Contributes to issue CURA-2822. --- cura/Settings/ContainerManager.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 9a2282c8c0..aee9eccdd7 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -218,6 +218,7 @@ class ContainerManager(QObject): entries = entry_name.split("/") entry_name = entries.pop() + sub_item_changed = False if entries: root_name = entries.pop(0) root = container.getMetaDataEntry(root_name) @@ -226,12 +227,16 @@ class ContainerManager(QObject): for entry in entries: item = item.get(entries.pop(0), { }) + if item[entry_name] != entry_value: + sub_item_changed = True item[entry_name] = entry_value entry_name = root_name entry_value = root container.setMetaDataEntry(entry_name, entry_value) + if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed. + container.metaDataChanged.emit(container) return True From 034686e9facc7fb64fff45657ea50028e6b709d8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 15:09:50 +0200 Subject: [PATCH 153/379] Don't modify list you're iterating over It doesn't give a problem right now since we're only iterating over lists of length 1 here, but in the future this could cause weird bugs. Contributes to issue CURA-2822. --- cura/Settings/ContainerManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index aee9eccdd7..0d776aec20 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -224,7 +224,7 @@ class ContainerManager(QObject): root = container.getMetaDataEntry(root_name) item = root - for entry in entries: + for _ in range(len(entries)): item = item.get(entries.pop(0), { }) if item[entry_name] != entry_value: From b3e49f0c12f5c0153acfecb0224705f3fa611efe Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 16:28:01 +0200 Subject: [PATCH 154/379] Fix getting the old approximate diameter The properties.approximate_diameter gets updated later via signals, so at this point it's not correct yet. Contributes to issue CURA-2822. --- resources/qml/Preferences/MaterialView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 39f2db0695..23e81067ed 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -169,7 +169,7 @@ TabView // This does not use a SettingPropertyProvider, because we need to make the change to all containers // which derive from the same base_file var old_diameter = Cura.ContainerManager.getContainerProperty(base.containerId, "material_diameter", "value").toString(); - base.setMetaDataEntry("approximate_diameter", properties.approximate_diameter, Math.round(value).toString()); + base.setMetaDataEntry("approximate_diameter", Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter"), Math.round(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Cura.MachineManager.activeMachine.approximateMaterialDiameter) { From 27bcb11dc92a4d4a7ffb55c8ac6261769604e573 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 16:41:24 +0200 Subject: [PATCH 155/379] Store old approximate diameter in variable Shorter line, easier to read. Contributes to issue CURA-2822. --- resources/qml/Preferences/MaterialView.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 23e81067ed..7183a3d926 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -169,7 +169,8 @@ TabView // This does not use a SettingPropertyProvider, because we need to make the change to all containers // which derive from the same base_file var old_diameter = Cura.ContainerManager.getContainerProperty(base.containerId, "material_diameter", "value").toString(); - base.setMetaDataEntry("approximate_diameter", Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter"), Math.round(value).toString()); + var old_approximate_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter"); + base.setMetaDataEntry("approximate_diameter", old_approximate_diameter, Math.round(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Cura.MachineManager.activeMachine.approximateMaterialDiameter) { From b8b23055ba60211f5890c955b3b4490a1319aa17 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 16:50:15 +0200 Subject: [PATCH 156/379] Fix getting new material diameter Same problem, it's not been updated yet at this point. Contributes to issue CURA-2822. --- resources/qml/Preferences/MaterialView.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 7183a3d926..39692a9f84 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -172,7 +172,8 @@ TabView var old_approximate_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter"); base.setMetaDataEntry("approximate_diameter", old_approximate_diameter, Math.round(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); - if (Cura.MachineManager.filterMaterialsByMachine && properties.approximate_diameter != Cura.MachineManager.activeMachine.approximateMaterialDiameter) + var new_approximate_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter"); + if (Cura.MachineManager.filterMaterialsByMachine && new_approximate_diameter != Cura.MachineManager.activeMachine.approximateMaterialDiameter) { Cura.MaterialManager.showMaterialWarningMessage(base.containerId, old_diameter); } From c77ff8ea8ba5b17d955662cf275bb14b286335b2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Jun 2017 16:54:12 +0200 Subject: [PATCH 157/379] Initial set of changed setup for sliceinfo CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 93 ++++++++++++++++------------ 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 7abb218dab..3acd16c322 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -11,6 +11,8 @@ from UM.Message import Message from UM.i18n import i18nCatalog from UM.Logger import Logger +import time + from UM.Qt.Duration import DurationFormat from .SliceInfoJob import SliceInfoJob @@ -50,52 +52,61 @@ class SliceInfo(Extension): try: if not Preferences.getInstance().getValue("info/send_slice_info"): Logger.log("d", "'info/send_slice_info' is turned off.") - return # Do nothing, user does not want to send data - - # Listing all files placed on the buildplate - modelhashes = [] - for node in DepthFirstIterator(CuraApplication.getInstance().getController().getScene().getRoot()): - if node.callDecoration("isSliceable"): - modelhashes.append(node.getMeshData().getHash()) - - # Creating md5sums and formatting them as discussed on JIRA - modelhash_formatted = ",".join(modelhashes) + return # Do nothing, user does not want to send data global_container_stack = Application.getInstance().getGlobalContainerStack() - # Get total material used (in mm^3) + data = dict() # The data that we're going to submit. + data["time_stamp"] = time.time() + data["schema_version"] = 0 + data["cura_version"] = Application.getInstance().getVersion() + data["active_mode"] = "" # TODO + data["language"] = Preferences.getInstance().getValue("general/language") + data["os"] = {"type": platform.system(), "version": platform.version()} + + data["active_machine_type"] = {"definition_id": global_container_stack.definition.getId()} + + data["extruders"] = [] # TODO + + data["quality_profile"] = global_container_stack.quality.getMetaData().get("quality_type") + + data["models"] = [] + # Listing all files placed on the build plate + for node in DepthFirstIterator(CuraApplication.getInstance().getController().getScene().getRoot()): + if node.callDecoration("isSliceable"): + model = dict() + model["hash"] = node.getMeshData().getHash() + bounding_box = node.getBoundingBox() + model["bounding_box"] = {"minimum": {"x": bounding_box.minimum.x, + "y": bounding_box.minimum.y, + "z": bounding_box.minimum.z}, + "maximum": {"x": bounding_box.maximum.x, + "y": bounding_box.maximum.y, + "z": bounding_box.maximum.z}} + model["transformation"] = {"data": str(node.getWorldTransformation().getData())} + print_information = Application.getInstance().getPrintInformation() - material_radius = 0.5 * global_container_stack.getProperty("material_diameter", "value") + print_times= print_information.printTimesPerFeature + data["print_times"] = {"travel": print_times["travel"].getDisplayString(DurationFormat.Format.Seconds), + "support": print_times["support"].getDisplayString(DurationFormat.Format.Seconds), + "infill": print_times["infill"].getDisplayString(DurationFormat.Format.Seconds), + "total": print_information.currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)} - # Send material per extruder - material_used = [str(math.pi * material_radius * material_radius * material_length) for material_length in print_information.materialLengths] - material_used = ",".join(material_used) + print_settings = dict() + print_settings["layer_height"] = global_container_stack.getProperty("layer_height", "value") + print_settings["support_enabled"] = global_container_stack.getProperty("support_enable", "value") + print_settings["infill_density"] = None # TODO: This can be different per extruder & model + print_settings["infill_type"] = None # TODO: This can be different per extruder & model + print_settings["print_sequence"] = global_container_stack.getProperty("print_sequence", "value") + print_settings["platform_adhesion"] = global_container_stack.getProperty("platform_adhesion", "value") + print_settings["retraction_enable"] = None #TODO; Can be different per extruder. + print_settings["travel_speed"] = None # TODO; Can be different per extruder + print_settings["cool_fan_enabled"] = None # TODO; Can be different per extruder + print_settings["bottom_thickness"] = None # TODO; Can be different per extruder & per mesh + print_settings["bottom_thickness"] = None # TODO; Can be different per extruder & per mesh + data["print_settings"] = print_settings - containers = { "": global_container_stack.serialize() } - for container in global_container_stack.getContainers(): - container_id = container.getId() - try: - container_serialized = container.serialize() - except NotImplementedError: - Logger.log("w", "Container %s could not be serialized!", container_id) - continue - if container_serialized: - containers[container_id] = container_serialized - else: - Logger.log("i", "No data found in %s to be serialized!", container_id) - - # Bundle the collected data - submitted_data = { - "processor": platform.processor(), - "machine": platform.machine(), - "platform": platform.platform(), - "settings": json.dumps(containers), # bundle of containers with their serialized contents - "version": Application.getInstance().getVersion(), - "modelhash": modelhash_formatted, - "printtime": print_information.currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601), - "filament": material_used, - "language": Preferences.getInstance().getValue("general/language"), - } + ''' # Convert data to bytes submitted_data = urllib.parse.urlencode(submitted_data) @@ -103,7 +114,7 @@ class SliceInfo(Extension): # Sending slice info non-blocking reportJob = SliceInfoJob(self.info_url, binary_data) - reportJob.start() + reportJob.start()''' except Exception as e: # We really can't afford to have a mistake here, as this would break the sending of g-code to a device # (Either saving or directly to a printer). The functionality of the slice data is not *that* important. From bb79e33ad55a4736f193ba8baf2d142c9f136720 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Jun 2017 16:55:47 +0200 Subject: [PATCH 158/379] Don't forget to update approximate diameter after resetting actual diameter The approximate diameter needs to be in a static field because the list model filters on that field. The filter function is not clever enough to be able to filter on values being in some kind of range or rounded, so instead the decision was made that the rounded value needs to be set in a separate field so that the static filter can filter on it. Contributes to issue CURA-2822. --- cura/Settings/MaterialManager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/MaterialManager.py b/cura/Settings/MaterialManager.py index abfafc5f9f..8bb7b525f8 100644 --- a/cura/Settings/MaterialManager.py +++ b/cura/Settings/MaterialManager.py @@ -49,6 +49,8 @@ class MaterialManager(QObject): if button == "Undo": container_manager = ContainerManager.getInstance() container_manager.setContainerMetaDataEntry(self._material_diameter_warning_message.material_id, "properties/diameter", self._material_diameter_warning_message.previous_diameter) + approximate_previous_diameter = str(round(float(self._material_diameter_warning_message.previous_diameter))) + container_manager.setContainerMetaDataEntry(self._material_diameter_warning_message.material_id, "approximate_diameter", approximate_previous_diameter) message.hide() else: Logger.log("w", "Unknown button action for material diameter warning message: {action}".format(action = button)) \ No newline at end of file From 328ec0419d080e6b4895b33c29382a468bf969d8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 28 Jun 2017 11:49:02 +0200 Subject: [PATCH 159/379] Implement gradual support infill CURA-2724 --- resources/definitions/fdmprinter.def.json | 41 +++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a3642cf897..b421920713 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3406,6 +3406,47 @@ "enabled": "support_enable", "settable_per_mesh": true }, + "support_infill_sparse_thickness": + { + "label": "Support Infill Layer Thickness", + "description": "The thickness per layer of support infill material. This value should always be a multiple of the layer height and is otherwise rounded.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "resolveOrValue('layer_height')", + "maximum_value_warning": "0.75 * machine_nozzle_size", + "maximum_value": "resolveOrValue('layer_height') * 8", + "value": "resolveOrValue('layer_height')", + "enabled": "support_infill_rate > 0", + "limit_to_extruder": "support_infill_extruder_nr", + "settable_per_mesh": false + }, + "gradual_support_infill_steps": + { + "label": "Gradual Support Infill Steps", + "description": "Number of times to reduce the support infill density by half when getting further below top surfaces. Areas which are closer to top surfaces get a higher density, up to the Support Infill Density.", + "default_value": 0, + "type": "int", + "minimum_value": "0", + "maximum_value_warning": "5", + "maximum_value": "999999 if support_line_distance == 0 else (20 - math.log(support_line_distance) / math.log(2))", + "enabled": "support_enable", + "limit_to_extruder": "support_infill_extruder_nr", + "settable_per_mesh": false + }, + "gradual_support_infill_step_height": + { + "label": "Gradual Support Infill Step Height", + "description": "The height of support infill of a given density before switching to half the density.", + "unit": "mm", + "type": "float", + "default_value": 1.5, + "minimum_value": "0.0001", + "minimum_value_warning": "3 * resolveOrValue('layer_height')", + "enabled": "support_enable and gradual_support_infill_steps > 0", + "limit_to_extruder": "support_infill_extruder_nr", + "settable_per_mesh": false + }, "support_interface_enable": { "label": "Enable Support Interface", From f8b99b2bff3298e58eec5a5a6a9fb6c71dd39d9d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Jun 2017 18:02:07 +0200 Subject: [PATCH 160/379] Update README.md Removed old plugin (it's no longer needed, cura can do it on it's own) --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a3e7f9c0d5..c1ebb0993b 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ Please checkout [cura-build](https://github.com/Ultimaker/cura-build) Third party plugins ------------- -* [Print Cost Calculator](https://github.com/nallath/PrintCostCalculator): Calculates weight and monetary cost of your print. * [Post Processing Plugin](https://github.com/nallath/PostProcessingPlugin): Allows for post-processing scripts to run on g-code. * [Barbarian Plugin](https://github.com/nallath/BarbarianPlugin): Simple scale tool for imperial to metric. * [X3G Writer](https://github.com/Ghostkeeper/X3GWriter): Adds support for exporting X3G files. From adb93507c81ab55eca102a8dc6bce11dd2ddd5f3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 30 Jun 2017 08:42:39 +0200 Subject: [PATCH 161/379] Set material_diameter setting in approximate material diameter test Instead of the metadata entry, which was a previous implementation of the function. This is essentially just an update of the test. Contributes to issue CURA-2822. --- tests/Settings/TestGlobalStack.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index 3cac17fa3a..df9f31dc64 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -12,6 +12,7 @@ from UM.Settings.InstanceContainer import InstanceContainer #To test against the from UM.Settings.SettingInstance import InstanceState import UM.Settings.ContainerRegistry import UM.Settings.ContainerStack +import UM.Settings.SettingDefinition #To add settings to the definition. ## Fake container registry that always provides all containers you ask of. @pytest.yield_fixture() @@ -100,7 +101,9 @@ def test_addExtruder(global_stack): ]) def test_approximateMaterialDiameter(diameter, approximate_diameter, global_stack): global_stack.definition = DefinitionContainer(container_id = "TestDefinition") - global_stack.definition._metadata["material_diameter"] = str(diameter) + material_diameter = UM.Settings.SettingDefinition.SettingDefinition(key = "material_diameter", container = global_stack.definition) + material_diameter.addSupportedProperty("value", UM.Settings.SettingDefinition.DefinitionPropertyType.Any, default = diameter) + global_stack.definition.definitions.append(material_diameter) assert float(global_stack.approximateMaterialDiameter) == approximate_diameter ## Tests getting the material diameter when there is no material diameter. From 3e278cbd0a7a62898f339396490c4e67e7549126 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 30 Jun 2017 08:47:49 +0200 Subject: [PATCH 162/379] Add test for very large material diameters Shouldn't matter with Python, but you never know. Contributes to issue CURA-2822. --- tests/Settings/TestGlobalStack.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index df9f31dc64..c6491d574c 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -97,7 +97,8 @@ def test_addExtruder(global_stack): #Exceptional cases. (0, 0), (-10.1, -10), - (-1, -1) + (-1, -1), + (9000.1, 9000) ]) def test_approximateMaterialDiameter(diameter, approximate_diameter, global_stack): global_stack.definition = DefinitionContainer(container_id = "TestDefinition") From 5c9e3c1e4da7acd68fb6f2a54613160ae6f59d92 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 10:30:33 +0200 Subject: [PATCH 163/379] Extruders are now correctly filled in slicdeInfo CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 3acd16c322..efcb3f7c8a 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the AGPLv3 or higher. from cura.CuraApplication import CuraApplication +from cura.Settings.ExtruderManager import ExtruderManager from UM.Extension import Extension from UM.Application import Application @@ -55,6 +56,7 @@ class SliceInfo(Extension): return # Do nothing, user does not want to send data global_container_stack = Application.getInstance().getGlobalContainerStack() + print_information = Application.getInstance().getPrintInformation() data = dict() # The data that we're going to submit. data["time_stamp"] = time.time() @@ -66,7 +68,21 @@ class SliceInfo(Extension): data["active_machine_type"] = {"definition_id": global_container_stack.definition.getId()} - data["extruders"] = [] # TODO + data["extruders"] = [] + extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) + extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position")) + + if not extruders: + extruders = [global_container_stack] + + for extruder in extruders: + extruder_dict = dict() + extruder_dict["active"] = ExtruderManager.getInstance().getActiveExtruderStack() == extruder + extruder_dict["material"] = extruder.material.getMetaData().get("GUID", "") + extruder_dict["material_used"] = print_information.materialLengths[int(extruder.getMetaDataEntry("position", "0"))] + extruder_dict["variant"] = extruder.variant.getName() + extruder_dict["nozzle_size"] = extruder.getProperty("machine_nozzle_size", "value") + data["extruders"].append(extruder_dict) data["quality_profile"] = global_container_stack.quality.getMetaData().get("quality_type") @@ -84,8 +100,10 @@ class SliceInfo(Extension): "y": bounding_box.maximum.y, "z": bounding_box.maximum.z}} model["transformation"] = {"data": str(node.getWorldTransformation().getData())} + extruder_position = node.callDecoration("getActiveExtruderPosition") + model["extruder"] = 0 if extruder_position is None else extruder_position + - print_information = Application.getInstance().getPrintInformation() print_times= print_information.printTimesPerFeature data["print_times"] = {"travel": print_times["travel"].getDisplayString(DurationFormat.Format.Seconds), "support": print_times["support"].getDisplayString(DurationFormat.Format.Seconds), @@ -105,7 +123,7 @@ class SliceInfo(Extension): print_settings["bottom_thickness"] = None # TODO; Can be different per extruder & per mesh print_settings["bottom_thickness"] = None # TODO; Can be different per extruder & per mesh data["print_settings"] = print_settings - + #print(data) ''' # Convert data to bytes From d38eb7f4e4881865cf0aafc0393ba6634df3583c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 10:35:16 +0200 Subject: [PATCH 164/379] Model data is now actually appended to data that's being sent CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index efcb3f7c8a..091cdcb5af 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -102,6 +102,7 @@ class SliceInfo(Extension): model["transformation"] = {"data": str(node.getWorldTransformation().getData())} extruder_position = node.callDecoration("getActiveExtruderPosition") model["extruder"] = 0 if extruder_position is None else extruder_position + data["models"].append(model) print_times= print_information.printTimesPerFeature From 9db00fa9c0d05daec6beff9a57629d928bd06031 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 10:39:22 +0200 Subject: [PATCH 165/379] Also send if the user changed the machine definition CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 091cdcb5af..11890650fb 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -63,6 +63,7 @@ class SliceInfo(Extension): data["schema_version"] = 0 data["cura_version"] = Application.getInstance().getVersion() data["active_mode"] = "" # TODO + data["machine_settings_changed_by_user"] = global_container_stack.definitionChanges.getId() != "empty" data["language"] = Preferences.getInstance().getValue("general/language") data["os"] = {"type": platform.system(), "version": platform.version()} From 71c146f4379c24af2e05ffadd690c3b24e5ed4eb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 30 Jun 2017 13:04:09 +0200 Subject: [PATCH 166/379] Always send not-printed objects to slicer regardless of build volume Objects that aren't printed, such as infill meshes, can simply be sent to the slicer regardless of whether they are inside or outside the build volume, because they don't generate g-code in their own volume. This way you can have a model that is partially outside the build volume that still does its anti-overhang task or whatever. Contributes to issue CURA-3951. --- plugins/CuraEngineBackend/StartSliceJob.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index c83ffb655d..f2e9cb7db2 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -44,6 +44,14 @@ class GcodeStartEndFormatter(Formatter): ## Job class that builds up the message of scene data to send to CuraEngine. class StartSliceJob(Job): + ## Meshes that are sent to the engine regardless of being outside of the + # build volume. + # + # If these settings are True for any mesh, the build volume is ignored. + # Note that Support Mesh is not in here because it actually generates + # g-code in the volume of the mesh. + _not_printed_mesh_settings = {"anti_overhang_mesh", "infill_mesh", "cutting_mesh"} + def __init__(self, slice_message): super().__init__() @@ -132,7 +140,8 @@ class StartSliceJob(Job): temp_list = [] for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - if not getattr(node, "_outside_buildarea", False): + if not getattr(node, "_outside_buildarea", False)\ + or (node.callDecoration("getStack") and any(node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): temp_list.append(node) Job.yieldThread() From a8492b3a6fede8de8bd8c63970a20c4b075f7511 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 13:33:39 +0200 Subject: [PATCH 167/379] Added few more fields (brand & manufacturer) to brand & machine CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 11890650fb..8c969ffeec 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -67,7 +67,7 @@ class SliceInfo(Extension): data["language"] = Preferences.getInstance().getValue("general/language") data["os"] = {"type": platform.system(), "version": platform.version()} - data["active_machine_type"] = {"definition_id": global_container_stack.definition.getId()} + data["active_machine"] = {"definition_id": global_container_stack.definition.getId(), "manufacturer": global_container_stack.definition.getMetaData().get("manufacturer","")} data["extruders"] = [] extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) @@ -79,7 +79,10 @@ class SliceInfo(Extension): for extruder in extruders: extruder_dict = dict() extruder_dict["active"] = ExtruderManager.getInstance().getActiveExtruderStack() == extruder - extruder_dict["material"] = extruder.material.getMetaData().get("GUID", "") + extruder_dict["material"] = {"GUID": extruder.material.getMetaData().get("GUID", ""), + "type": extruder.material.getMetaData().get("material", ""), + "brand": extruder.material.getMetaData().get("brand", "") + } extruder_dict["material_used"] = print_information.materialLengths[int(extruder.getMetaDataEntry("position", "0"))] extruder_dict["variant"] = extruder.variant.getName() extruder_dict["nozzle_size"] = extruder.getProperty("machine_nozzle_size", "value") From 5d0908e8ced209d539a9a3caaae216027e4f6efa Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 15:19:53 +0200 Subject: [PATCH 168/379] Added handling for timeout & network connection broken CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 38 ++++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 02f50e7a02..5ef3e6e335 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -8,7 +8,7 @@ from UM.PluginRegistry import PluginRegistry from UM.Application import Application from UM.Version import Version -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtQml import QQmlComponent, QQmlContext @@ -94,10 +94,7 @@ class PluginBrowser(QObject, Extension): def _onDownloadPluginProgress(self, bytes_sent, bytes_total): if bytes_total > 0: new_progress = bytes_sent / bytes_total * 100 - if new_progress > self._download_progress: - self._download_progress = new_progress - self.onDownloadProgressChanged.emit() - self._download_progress = new_progress + self.setDownloadProgress(new_progress) if new_progress == 100.0: self.setIsDownloading(False) self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) @@ -117,6 +114,11 @@ class PluginBrowser(QObject, Extension): def downloadProgress(self): return self._download_progress + def setDownloadProgress(self, progress): + if progress != self._download_progress: + self._download_progress = progress + self.onDownloadProgressChanged.emit() + @pyqtSlot(str) def downloadAndInstallPlugin(self, url): Logger.log("i", "Attempting to download & install plugin from %s", url) @@ -124,9 +126,8 @@ class PluginBrowser(QObject, Extension): self._download_plugin_request = QNetworkRequest(url) self._download_plugin_request.setRawHeader(*self._request_header) self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) - self._download_progress = 0 + self.setDownloadProgress(0) self.setIsDownloading(True) - self.onDownloadProgressChanged.emit() self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) @pyqtProperty(QObject, notify=pluginsMetadataChanged) @@ -180,6 +181,16 @@ class PluginBrowser(QObject, Extension): def _onRequestFinished(self, reply): reply_url = reply.url().toString() + + if reply.error() == QNetworkReply.TimeoutError: + Logger.log("w", "Got a timeout.") + # Reset everything. + self.setDownloadProgress(0) + self.setIsDownloading(False) + if self._download_plugin_reply: + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._download_plugin_reply.abort() + self._download_plugin_reply = None if reply.operation() == QNetworkAccessManager.GetOperation: if reply_url == self._api_url + "plugins": try: @@ -193,9 +204,20 @@ class PluginBrowser(QObject, Extension): # Ignore any operation that is not a get operation pass + def _onNetworkAccesibleChanged(self, accessible): + if accessible == 0: + self.setDownloadProgress(0) + self.setIsDownloading(False) + if self._download_plugin_reply: + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._download_plugin_reply.abort() + self._download_plugin_reply = None + def _createNetworkManager(self): if self._network_manager: self._network_manager.finished.disconnect(self._onRequestFinished) + self._network_manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) self._network_manager = QNetworkAccessManager() - self._network_manager.finished.connect(self._onRequestFinished) \ No newline at end of file + self._network_manager.finished.connect(self._onRequestFinished) + self._network_manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) \ No newline at end of file From 52954460a3f1a6601d725829e19e60d4508aaf1b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 15:30:22 +0200 Subject: [PATCH 169/379] Added refresh option for plugin list. This fixes the issue that if you don't have internet connection on first start of the browser, you'd need a reboot of cura to get the list. CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 8 +++++++- plugins/PluginBrowser/PluginBrowser.qml | 24 +++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 5ef3e6e335..3957fcb9a4 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -66,7 +66,9 @@ class PluginBrowser(QObject, Extension): self._createDialog() self._dialog.show() + @pyqtSlot() def requestPluginList(self): + Logger.log("i", "Requesting plugin list") url = QUrl(self._api_url + "plugins") self._plugin_list_request = QNetworkRequest(url) self._plugin_list_request.setRawHeader(*self._request_header) @@ -181,7 +183,6 @@ class PluginBrowser(QObject, Extension): def _onRequestFinished(self, reply): reply_url = reply.url().toString() - if reply.error() == QNetworkReply.TimeoutError: Logger.log("w", "Got a timeout.") # Reset everything. @@ -191,6 +192,11 @@ class PluginBrowser(QObject, Extension): self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) self._download_plugin_reply.abort() self._download_plugin_reply = None + return + elif reply.error() == QNetworkReply.HostNotFoundError: + Logger.log("w", "Unable to reach server.") + return + if reply.operation() == QNetworkAccessManager.GetOperation: if reply_url == self._api_url + "plugins": try: diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 841a1828a2..a9596b0abd 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -14,17 +14,31 @@ UM.Dialog Item { anchors.fill: parent - Label + Item { - id: introText - text: catalog.i18nc("@label", "Here you can find a list of Third Party plugins.") + id: topBar + height: childrenRect.height; width: parent.width - height: 30 + Label + { + id: introText + text: catalog.i18nc("@label", "Here you can find a list of Third Party plugins.") + width: parent.width + height: 30 + } + + Button + { + id: refresh + text: catalog.i18nc("@action:button", "Refresh") + onClicked: manager.requestPluginList() + anchors.right: parent.right + } } ScrollView { width: parent.width - anchors.top: introText.bottom + anchors.top: topBar.bottom anchors.bottom: progressbar.top anchors.bottomMargin: UM.Theme.getSize("default_margin").height frameVisible: true From e98a6d76ba31a260e79fde2bc5abfe0e647f3bf2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Jun 2017 15:40:51 +0200 Subject: [PATCH 170/379] Added close button CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 38 +++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index a9596b0abd..fc9612a798 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -39,7 +39,7 @@ UM.Dialog { width: parent.width anchors.top: topBar.bottom - anchors.bottom: progressbar.top + anchors.bottom: bottomBar.top anchors.bottomMargin: UM.Theme.getSize("default_margin").height frameVisible: true ListView @@ -51,16 +51,36 @@ UM.Dialog delegate: pluginDelegate } } - ProgressBar + Item { - id: progressbar - anchors.bottom: parent.bottom - style: UM.Theme.styles.progressbar - minimumValue: 0; - maximumValue: 100 + id: bottomBar width: parent.width - height: 10 - value: manager.downloadProgress + height: childrenRect.height + anchors.bottom:parent.bottom + anchors.left: parent.left + ProgressBar + { + id: progressbar + anchors.bottom: parent.bottom + style: UM.Theme.styles.progressbar + minimumValue: 0; + maximumValue: 100 + anchors.left:parent.left + anchors.right: closeButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + height: 10 + value: manager.downloadProgress + } + + Button + { + id: closeButton + text: catalog.i18nc("@action:button", "Close") + iconName: "dialog-close" + onClicked: base.close() + anchors.bottom: parent.bottom + anchors.right: parent.right + } } Item From 7b494cccf7e929d793f308d2c92a4565794a8a16 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 30 Jun 2017 15:49:35 +0200 Subject: [PATCH 171/379] Only enable gradual_support_infill_steps when support infill density > 0 CURA-2724 --- 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 b421920713..79b52f40e7 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3430,7 +3430,7 @@ "minimum_value": "0", "maximum_value_warning": "5", "maximum_value": "999999 if support_line_distance == 0 else (20 - math.log(support_line_distance) / math.log(2))", - "enabled": "support_enable", + "enabled": "support_enable and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, From 60379d395d46d9867028874d596409c32c74edfe Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 30 Jun 2017 17:59:47 +0200 Subject: [PATCH 172/379] feat: spaghetti infill stepping vs all volume at once (CURA-3861) --- resources/definitions/fdmprinter.def.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0760533f33..329daa5fa6 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4911,6 +4911,16 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, + "spaghetti_infill_stepped": + { + "label": "Spaghetti Infill Stepping", + "description": "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print.", + "type": "bool", + "default_value": true, + "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled", + "limit_to_extruder": "infill_extruder_nr", + "settable_per_mesh": true + }, "spaghetti_max_infill_angle": { "label": "Spaghetti Maximum Infill Angle", @@ -4921,7 +4931,7 @@ "minimum_value": "0", "maximum_value": "90", "maximum_value_warning": "45", - "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled", + "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled and not spaghetti_infill_stepped", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, @@ -4934,7 +4944,7 @@ "default_value": 2.0, "minimum_value": "layer_height", "maximum_value_warning": "10.0", - "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled", + "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled and not spaghetti_infill_stepped", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, From 319559740dd8c8c2f9ffad637bee43cef9345073 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 3 Jul 2017 10:53:50 +0200 Subject: [PATCH 173/379] Also invert nozzle offset when offsetting machine-specified disallowed areas We inverted it properly with the borders, but not here yet. --- cura/BuildVolume.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 53e1471f7b..de36b80123 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager @@ -727,7 +727,7 @@ class BuildVolume(SceneNode): offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") if offset_x is None: offset_x = 0 - offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") + offset_y = -extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 else: From 848c607db165fe56990d9ad8b5c0d8295e3ade6b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 3 Jul 2017 11:11:23 +0200 Subject: [PATCH 174/379] Only enable gradual support if support infill rate > 0 CURA-2724 --- 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 79b52f40e7..509bd4010c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3443,7 +3443,7 @@ "default_value": 1.5, "minimum_value": "0.0001", "minimum_value_warning": "3 * resolveOrValue('layer_height')", - "enabled": "support_enable and gradual_support_infill_steps > 0", + "enabled": "support_enable and support_infill_rate > 0 and gradual_support_infill_steps > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, From 3abde17466c4997cf44a8f056584ffac3aea6fbe Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 12:57:50 +0200 Subject: [PATCH 175/379] Updated list of settings to be sent. CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 68 +++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 8c969ffeec..e00eae7523 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -86,6 +86,16 @@ class SliceInfo(Extension): extruder_dict["material_used"] = print_information.materialLengths[int(extruder.getMetaDataEntry("position", "0"))] extruder_dict["variant"] = extruder.variant.getName() extruder_dict["nozzle_size"] = extruder.getProperty("machine_nozzle_size", "value") + + extruder_settings = dict() + extruder_settings["wall_line_count"] = extruder.getProperty("wall_line_count", "value") + extruder_settings["retraction_enable"] = extruder.getProperty("retraction_enable", "value") + extruder_settings["infill_sparse_density"] = extruder.getProperty("infill_sparse_density", "value") + extruder_settings["infill_pattern"] = extruder.getProperty("infill_pattern", "value") + extruder_settings["gradual_infill_steps"] = extruder.getProperty("gradual_infill_steps", "value") + extruder_settings["default_material_print_temperature"] = extruder.getProperty("default_material_print_temperature", "value") + extruder_settings["material_print_temperature"] = extruder.getProperty("material_print_temperature", "value") + extruder_dict["extruder_settings"] = extruder_settings data["extruders"].append(extruder_dict) data["quality_profile"] = global_container_stack.quality.getMetaData().get("quality_type") @@ -106,10 +116,34 @@ class SliceInfo(Extension): model["transformation"] = {"data": str(node.getWorldTransformation().getData())} extruder_position = node.callDecoration("getActiveExtruderPosition") model["extruder"] = 0 if extruder_position is None else extruder_position + + + model_settings = dict() + model_stack = node.callDecoration("getStack") + if model_stack: + model_settings["support_enabled"] = model_stack.getProperty("support_enable", "value") + model_settings["support_extruder_nr"] = int(model_stack.getProperty("support_extruder_nr", "value")) + + # Mesh modifiers; + model_settings["infill_mesh"] = model_stack.getProperty("infill_mesh", "value") + model_settings["cutting_mesh"] = model_stack.getProperty("cutting_mesh", "value") + model_settings["support_mesh"] = model_stack.getProperty("support_mesh", "value") + model_settings["anti_overhang_mesh"] = model_stack.getProperty("anti_overhang_mesh", "value") + + model_settings["wall_line_count"] = model_stack.getProperty("wall_line_count", "value") + model_settings["retraction_enable"] = model_stack.getProperty("retraction_enable", "value") + + # Infill settings + model_settings["infill_sparse_density"] = model_stack.getProperty("infill_sparse_density", "value") + model_settings["infill_pattern"] = model_stack.getProperty("infill_pattern", "value") + model_settings["gradual_infill_steps"] = model_stack.getProperty("gradual_infill_steps", "value") + + + model["model_settings"] = model_settings + data["models"].append(model) - - print_times= print_information.printTimesPerFeature + print_times = print_information.printTimesPerFeature data["print_times"] = {"travel": print_times["travel"].getDisplayString(DurationFormat.Format.Seconds), "support": print_times["support"].getDisplayString(DurationFormat.Format.Seconds), "infill": print_times["infill"].getDisplayString(DurationFormat.Format.Seconds), @@ -117,18 +151,30 @@ class SliceInfo(Extension): print_settings = dict() print_settings["layer_height"] = global_container_stack.getProperty("layer_height", "value") + + # Support settings print_settings["support_enabled"] = global_container_stack.getProperty("support_enable", "value") - print_settings["infill_density"] = None # TODO: This can be different per extruder & model - print_settings["infill_type"] = None # TODO: This can be different per extruder & model - print_settings["print_sequence"] = global_container_stack.getProperty("print_sequence", "value") + print_settings["support_extruder_nr"] = int(global_container_stack.getProperty("support_extruder_nr", "value")) + + # Platform adhesion settings print_settings["platform_adhesion"] = global_container_stack.getProperty("platform_adhesion", "value") - print_settings["retraction_enable"] = None #TODO; Can be different per extruder. - print_settings["travel_speed"] = None # TODO; Can be different per extruder - print_settings["cool_fan_enabled"] = None # TODO; Can be different per extruder - print_settings["bottom_thickness"] = None # TODO; Can be different per extruder & per mesh - print_settings["bottom_thickness"] = None # TODO; Can be different per extruder & per mesh + + # Shell settings + print_settings["wall_line_count"] = global_container_stack.getProperty("wall_line_count", "value") + print_settings["retraction_enable"] = global_container_stack.getProperty("retraction_enable", "value") + + # Prime tower settings + print_settings["prime_tower_enable"] = global_container_stack.getProperty("prime_tower_enable", "value") + + # Infill settings + print_settings["infill_sparse_density"] = global_container_stack.getProperty("infill_sparse_density", "value") + print_settings["infill_pattern"] = global_container_stack.getProperty("infill_pattern", "value") + print_settings["gradual_infill_steps"] = global_container_stack.getProperty("gradual_infill_steps", "value") + + print_settings["print_sequence"] = global_container_stack.getProperty("print_sequence", "value") + data["print_settings"] = print_settings - #print(data) + #print(json.dumps(data)) ''' # Convert data to bytes From 1682348629d61691d509adc2d1ba7010be2c8f7c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 13:10:17 +0200 Subject: [PATCH 176/379] Send data to new server CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index e00eae7523..66fc507918 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -31,7 +31,7 @@ catalog = i18nCatalog("cura") # The data is only sent when the user in question gave permission to do so. All data is anonymous and # no model files are being sent (Just a SHA256 hash of the model). class SliceInfo(Extension): - info_url = "https://stats.youmagine.com/curastats/slice" + info_url = "http://stats.ultimaker.com/api/cura" def __init__(self): super().__init__() @@ -174,17 +174,14 @@ class SliceInfo(Extension): print_settings["print_sequence"] = global_container_stack.getProperty("print_sequence", "value") data["print_settings"] = print_settings - #print(json.dumps(data)) - ''' # Convert data to bytes - submitted_data = urllib.parse.urlencode(submitted_data) - binary_data = submitted_data.encode("utf-8") + binary_data = json.dumps(data).encode("utf-8") # Sending slice info non-blocking reportJob = SliceInfoJob(self.info_url, binary_data) - reportJob.start()''' - except Exception as e: + reportJob.start() + except Exception: # We really can't afford to have a mistake here, as this would break the sending of g-code to a device # (Either saving or directly to a printer). The functionality of the slice data is not *that* important. - Logger.log("e", "Exception raised while sending slice info: %s" %(repr(e))) # But we should be notified about these problems of course. + Logger.logException("e", "Exception raised while sending slice info.") # But we should be notified about these problems of course. From d69736ac34a3f0d3527bdecf0aa606fe10ed51c4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 13:13:42 +0200 Subject: [PATCH 177/379] Filter \n from transformation string CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 66fc507918..0c6fa14b3b 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -113,7 +113,7 @@ class SliceInfo(Extension): "maximum": {"x": bounding_box.maximum.x, "y": bounding_box.maximum.y, "z": bounding_box.maximum.z}} - model["transformation"] = {"data": str(node.getWorldTransformation().getData())} + model["transformation"] = {"data": str(node.getWorldTransformation().getData()).replace("\n", "")} extruder_position = node.callDecoration("getActiveExtruderPosition") model["extruder"] = 0 if extruder_position is None else extruder_position From a1413e816238cf226dd0a621ee61306d9f1a6ca8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 13:18:23 +0200 Subject: [PATCH 178/379] Added active mode to sliceinfo CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 0c6fa14b3b..bce98dd681 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -62,7 +62,13 @@ class SliceInfo(Extension): data["time_stamp"] = time.time() data["schema_version"] = 0 data["cura_version"] = Application.getInstance().getVersion() - data["active_mode"] = "" # TODO + + active_mode = Preferences.getInstance().getValue("cura/active_mode") + if active_mode == 0: + data["active_mode"] = "recommended" + else: + data["active_mode"] = "custom" + data["machine_settings_changed_by_user"] = global_container_stack.definitionChanges.getId() != "empty" data["language"] = Preferences.getInstance().getValue("general/language") data["os"] = {"type": platform.system(), "version": platform.version()} @@ -117,7 +123,6 @@ class SliceInfo(Extension): extruder_position = node.callDecoration("getActiveExtruderPosition") model["extruder"] = 0 if extruder_position is None else extruder_position - model_settings = dict() model_stack = node.callDecoration("getStack") if model_stack: @@ -138,7 +143,6 @@ class SliceInfo(Extension): model_settings["infill_pattern"] = model_stack.getProperty("infill_pattern", "value") model_settings["gradual_infill_steps"] = model_stack.getProperty("gradual_infill_steps", "value") - model["model_settings"] = model_settings data["models"].append(model) From 8776cedd278ab0830f4f621d013e7ef75efbb9d1 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 3 Jul 2017 14:46:31 +0200 Subject: [PATCH 179/379] Add margins to buttons and progressBar so they align CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index fc9612a798..f992efa926 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -33,6 +33,7 @@ UM.Dialog text: catalog.i18nc("@action:button", "Refresh") onClicked: manager.requestPluginList() anchors.right: parent.right + anchors.rightMargin: -3 } } ScrollView @@ -68,7 +69,8 @@ UM.Dialog anchors.left:parent.left anchors.right: closeButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width - height: 10 + anchors.bottomMargin: 4 + height: UM.Theme.getSize("default_margin").height value: manager.downloadProgress } @@ -80,6 +82,7 @@ UM.Dialog onClicked: base.close() anchors.bottom: parent.bottom anchors.right: parent.right + anchors.rightMargin: -3 } } From 8a55469499117bc9a64ed047b70cc14801419cb6 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 3 Jul 2017 14:49:26 +0200 Subject: [PATCH 180/379] Revert "Add margins to buttons and progressBar so they align" This reverts commit 8776cedd278ab0830f4f621d013e7ef75efbb9d1. --- plugins/PluginBrowser/PluginBrowser.qml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index f992efa926..fc9612a798 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -33,7 +33,6 @@ UM.Dialog text: catalog.i18nc("@action:button", "Refresh") onClicked: manager.requestPluginList() anchors.right: parent.right - anchors.rightMargin: -3 } } ScrollView @@ -69,8 +68,7 @@ UM.Dialog anchors.left:parent.left anchors.right: closeButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.bottomMargin: 4 - height: UM.Theme.getSize("default_margin").height + height: 10 value: manager.downloadProgress } @@ -82,7 +80,6 @@ UM.Dialog onClicked: base.close() anchors.bottom: parent.bottom anchors.right: parent.right - anchors.rightMargin: -3 } } From 7e07482dec3373bf20bfa64277feef106ffceffd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 15:44:42 +0200 Subject: [PATCH 181/379] Added topbar to Cura CURA-3964 --- resources/qml/Cura.qml | 17 ++- resources/qml/Sidebar.qml | 215 ------------------------------- resources/qml/Topbar.qml | 208 ++++++++++++++++++++++++++++++ resources/themes/cura/styles.qml | 63 ++++++--- resources/themes/cura/theme.json | 2 + 5 files changed, 264 insertions(+), 241 deletions(-) create mode 100644 resources/qml/Topbar.qml diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 612ef6b41b..779bb7d001 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -329,7 +329,8 @@ UM.MainWindow tooltip: ''; anchors { - top: parent.top; + top: topbar.bottom; + topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; } action: Cura.Actions.open; @@ -371,13 +372,21 @@ UM.MainWindow } } + Topbar + { + id: topbar + anchors.left:parent.left + anchors.right: parent.right + anchors.top: parent.top + } + Sidebar { id: sidebar; anchors { - top: parent.top; + top: topbar.bottom; bottom: parent.bottom; right: parent.right; } @@ -412,7 +421,7 @@ UM.MainWindow color: UM.Theme.getColor("viewport_overlay") anchors { - top: parent.top + top: topbar.bottom bottom: parent.bottom left:parent.left right: sidebar.left @@ -437,8 +446,6 @@ UM.MainWindow anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenterOffset: - UM.Theme.getSize("sidebar").width / 2 - - } UM.MessageStack diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index ec187cef91..e446fba653 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -88,221 +88,6 @@ Rectangle } } - // Printer selection and mode selection buttons for changing between Setting & Monitor print mode - Rectangle - { - id: sidebarHeaderBar - anchors.left: parent.left - anchors.right: parent.right - height: childrenRect.height - color: UM.Theme.getColor("sidebar_header_bar") - - Row - { - anchors.left: parent.left - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - spacing: UM.Theme.getSize("default_margin").width - - ToolButton - { - id: machineSelection - text: Cura.MachineManager.activeMachineName - - width: parent.width - (showSettings.width + showMonitor.width + 2 * UM.Theme.getSize("default_margin").width) - height: UM.Theme.getSize("sidebar_header").height - tooltip: Cura.MachineManager.activeMachineName - - anchors.verticalCenter: parent.verticalCenter - style: ButtonStyle { - background: Rectangle { - color: { - if(control.pressed) { - return UM.Theme.getColor("sidebar_header_active"); - } else if(control.hovered) { - return UM.Theme.getColor("sidebar_header_hover"); - } else { - return UM.Theme.getColor("sidebar_header_bar"); - } - } - Behavior on color { ColorAnimation { duration: 50; } } - - Rectangle { - id: underline; - - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - height: UM.Theme.getSize("sidebar_header_highlight").height - color: UM.Theme.getColor("sidebar_header_highlight_hover") - visible: control.hovered || control.pressed - } - - UM.RecolorImage { - id: downArrow - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text_reversed") - source: UM.Theme.getIcon("arrow_bottom") - } - Label { - id: sidebarComboBoxLabel - color: UM.Theme.getColor("text_reversed") - text: control.text; - elide: Text.ElideRight; - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: downArrow.left; - anchors.rightMargin: control.rightMargin; - anchors.verticalCenter: parent.verticalCenter; - font: UM.Theme.getFont("large") - } - } - label: Label{} - } - - menu: PrinterMenu { } - } - - Button - { - id: showSettings - width: height - height: UM.Theme.getSize("sidebar_header").height - onClicked: monitoringPrint = false - iconSource: UM.Theme.getIcon("tab_settings"); - property color overlayColor: "transparent" - property string overlayIconSource: "" - - checkable: true - checked: !monitoringPrint - exclusiveGroup: sidebarHeaderBarGroup - property string tooltipText: catalog.i18nc("@tooltip", "Print Setup

Edit or review the settings for the active print job.") - - onHoveredChanged: { - if (hovered) - { - tooltipDelayTimer.item = showSettings - tooltipDelayTimer.text = tooltipText - tooltipDelayTimer.start(); - } - else - { - tooltipDelayTimer.stop(); - base.hideTooltip(); - } - } - - style: UM.Theme.styles.sidebar_header_tab - } - - Button - { - id: showMonitor - width: height - height: UM.Theme.getSize("sidebar_header").height - onClicked: monitoringPrint = true - iconSource: printerConnected ? UM.Theme.getIcon("tab_monitor_with_status") : UM.Theme.getIcon("tab_monitor") - property color overlayColor: - { - if(!printerAcceptsCommands) - { - return UM.Theme.getColor("status_unknown"); - } - - if(Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") - { - return UM.Theme.getColor("status_busy"); - } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) - { - case "printing": - case "pre_print": - case "wait_cleanup": - case "pausing": - case "resuming": - return UM.Theme.getColor("status_busy"); - case "ready": - case "": - return UM.Theme.getColor("status_ready"); - case "paused": - return UM.Theme.getColor("status_paused"); - case "error": - return UM.Theme.getColor("status_stopped"); - case "offline": - return UM.Theme.getColor("status_offline"); - default: - return UM.Theme.getColor("text_reversed"); - } - } - property string overlayIconSource: - { - if(!printerConnected) - { - return ""; - } - else if(!printerAcceptsCommands) - { - return UM.Theme.getIcon("tab_status_unknown"); - } - - if(Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") - { - return UM.Theme.getIcon("tab_status_busy"); - } - - switch(Cura.MachineManager.printerOutputDevices[0].jobState) - { - case "printing": - case "pre_print": - case "wait_cleanup": - case "pausing": - case "resuming": - return UM.Theme.getIcon("tab_status_busy"); - case "ready": - case "": - return UM.Theme.getIcon("tab_status_connected") - case "paused": - return UM.Theme.getIcon("tab_status_paused") - case "error": - return UM.Theme.getIcon("tab_status_stopped") - case "offline": - return UM.Theme.getIcon("tab_status_offline") - default: - return "" - } - } - - checkable: true - checked: monitoringPrint - exclusiveGroup: sidebarHeaderBarGroup - property string tooltipText: catalog.i18nc("@tooltip", "Print Monitor

Monitor the state of the connected printer and the print job in progress.") - - onHoveredChanged: { - if (hovered) - { - tooltipDelayTimer.item = showMonitor - tooltipDelayTimer.text = tooltipText - tooltipDelayTimer.start(); - } - else - { - tooltipDelayTimer.stop(); - base.hideTooltip(); - } - } - - style: UM.Theme.styles.sidebar_header_tab - } - ExclusiveGroup { id: sidebarHeaderBarGroup } - } - } - SidebarHeader { id: header width: parent.width diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml new file mode 100644 index 0000000000..3c305b522a --- /dev/null +++ b/resources/qml/Topbar.qml @@ -0,0 +1,208 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura +import "Menus" + +Rectangle +{ + id: base + anchors.left: parent.left + anchors.right: parent.right + height: UM.Theme.getSize("sidebar_header").height + color: UM.Theme.getColor("sidebar_header_bar") + + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + + Row + { + anchors.left: parent.left + anchors.right: machineSelection.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_margin").width + + Button + { + id: showSettings + height: UM.Theme.getSize("sidebar_header").height + onClicked: monitoringPrint = false + iconSource: UM.Theme.getIcon("tab_settings"); + property color overlayColor: "transparent" + property string overlayIconSource: "" + text: "Prepare" + checkable: true + checked: !monitoringPrint + exclusiveGroup: sidebarHeaderBarGroup + + style: UM.Theme.styles.topbar_header_tab + } + + Button + { + id: showMonitor + height: UM.Theme.getSize("sidebar_header").height + onClicked: monitoringPrint = true + text: "Print" + iconSource: printerConnected ? UM.Theme.getIcon("tab_monitor_with_status") : UM.Theme.getIcon("tab_monitor") + property color overlayColor: + { + if(!printerAcceptsCommands) + { + return UM.Theme.getColor("status_unknown"); + } + + if(Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") + { + return UM.Theme.getColor("status_busy"); + } + switch(Cura.MachineManager.printerOutputDevices[0].jobState) + { + case "printing": + case "pre_print": + case "wait_cleanup": + case "pausing": + case "resuming": + return UM.Theme.getColor("status_busy"); + case "ready": + case "": + return UM.Theme.getColor("status_ready"); + case "paused": + return UM.Theme.getColor("status_paused"); + case "error": + return UM.Theme.getColor("status_stopped"); + case "offline": + return UM.Theme.getColor("status_offline"); + default: + return UM.Theme.getColor("text_reversed"); + } + } + property string overlayIconSource: + { + if(!printerConnected) + { + return ""; + } + else if(!printerAcceptsCommands) + { + return UM.Theme.getIcon("tab_status_unknown"); + } + + if(Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") + { + return UM.Theme.getIcon("tab_status_busy"); + } + + switch(Cura.MachineManager.printerOutputDevices[0].jobState) + { + case "printing": + case "pre_print": + case "wait_cleanup": + case "pausing": + case "resuming": + return UM.Theme.getIcon("tab_status_busy"); + case "ready": + case "": + return UM.Theme.getIcon("tab_status_connected") + case "paused": + return UM.Theme.getIcon("tab_status_paused") + case "error": + return UM.Theme.getIcon("tab_status_stopped") + case "offline": + return UM.Theme.getIcon("tab_status_offline") + default: + return "" + } + } + + checkable: true + checked: monitoringPrint + exclusiveGroup: sidebarHeaderBarGroup + + style: UM.Theme.styles.topbar_header_tab + } + + ExclusiveGroup { id: sidebarHeaderBarGroup } + } + + ToolButton + { + id: machineSelection + text: Cura.MachineManager.activeMachineName + + width: UM.Theme.getSize("sidebar").width; + height: UM.Theme.getSize("sidebar_header").height + tooltip: Cura.MachineManager.activeMachineName + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + style: ButtonStyle + { + background: Rectangle + { + color: + { + if(control.pressed) + { + return UM.Theme.getColor("sidebar_header_active"); + } else if(control.hovered) + { + return UM.Theme.getColor("sidebar_header_hover"); + } else + { + return UM.Theme.getColor("sidebar_header_bar"); + } + } + Behavior on color { ColorAnimation { duration: 50; } } + + Rectangle + { + id: underline; + + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + height: UM.Theme.getSize("sidebar_header_highlight").height + color: UM.Theme.getColor("sidebar_header_highlight_hover") + visible: control.hovered || control.pressed + } + + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text_reversed") + source: UM.Theme.getIcon("arrow_bottom") + } + Label + { + id: sidebarComboBoxLabel + color: UM.Theme.getColor("text_reversed") + text: control.text; + elide: Text.ElideRight; + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: downArrow.left; + anchors.rightMargin: control.rightMargin; + anchors.verticalCenter: parent.verticalCenter; + font: UM.Theme.getFont("large") + } + } + label: Label {} + } + + menu: PrinterMenu { } + } +} \ No newline at end of file diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index c4c441da43..d161d33d56 100755 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -138,11 +138,11 @@ QtObject { } } - property Component sidebar_header_tab: Component { + property Component topbar_header_tab: Component { ButtonStyle { background: Item { - implicitWidth: Theme.getSize("button").width; - implicitHeight: Theme.getSize("button").height; + implicitWidth: Theme.getSize("topbar_button").width; + implicitHeight: Theme.getSize("topbar_button").height; Rectangle { id: buttonFace; @@ -174,27 +174,48 @@ QtObject { } } - label: Item { - UM.RecolorImage { - color: UM.Theme.getColor("text_reversed") - anchors.centerIn: parent - opacity: !control.enabled ? 0.2 : 1.0 - source: control.iconSource - width: Theme.getSize("button_icon").width - height: Theme.getSize("button_icon").height + label: Item + { - sourceSize: Theme.getSize("button_icon") - } - UM.RecolorImage { - visible: control.overlayIconSource != "" - color: control.overlayColor - anchors.centerIn: parent - opacity: !control.enabled ? 0.2 : 1.0 - source: control.overlayIconSource - width: Theme.getSize("button_icon").width + implicitHeight: Theme.getSize("button_icon").height + implicitWidth: Theme.getSize("topbar_button").width; + Item + { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter; + width: childrenRect.width height: Theme.getSize("button_icon").height + UM.RecolorImage + { + id: icon + color: UM.Theme.getColor("text_reversed") + opacity: !control.enabled ? 0.2 : 1.0 + source: control.iconSource + width: Theme.getSize("button_icon").width + height: Theme.getSize("button_icon").height - sourceSize: Theme.getSize("button_icon") + sourceSize: Theme.getSize("button_icon") + } + UM.RecolorImage + { + visible: control.overlayIconSource != "" + color: control.overlayColor + opacity: !control.enabled ? 0.2 : 1.0 + source: control.overlayIconSource + width: Theme.getSize("button_icon").width + height: Theme.getSize("button_icon").height + + sourceSize: Theme.getSize("button_icon") + } + Label + { + text: control.text; + anchors.left: icon.right + anchors.leftMargin: Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter; + font: UM.Theme.getFont("large"); + color: UM.Theme.getColor("text_reversed") + } } } } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index a36f271fe8..60b542dbf4 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -291,6 +291,8 @@ "button_icon": [2.5, 2.5], "button_lining": [0, 0], + "topbar_button": [17, 4], + "button_tooltip": [1.0, 1.3], "button_tooltip_arrow": [0.25, 0.25], From 5fec3d4f6da8d52706742eb2cc93d19e0b66fd27 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 22 Jun 2017 16:52:11 +0200 Subject: [PATCH 182/379] Replace mock borders with true borders --- plugins/LayerView/LayerView.qml | 19 +++++++------------ resources/qml/Toolbar.qml | 17 ++++------------- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 46268a784d..d8b37df719 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -39,6 +39,8 @@ Item height: parent.height z: slider.z - 1 color: UM.Theme.getColor("tool_panel_background") + borderWidth: UM.Theme.getSize("default_lining").width + borderColor: UM.Theme.getColor("lining") target: parent.buttonTarget arrowSize: UM.Theme.getSize("default_arrow").width @@ -530,26 +532,19 @@ Item target: Qt.point(0, slider.activeHandle.y + slider.activeHandle.height / 2) arrowSize: UM.Theme.getSize("default_arrow").width - height: (Math.floor(UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height) / 2) * 2 // Make sure height has an integer middle so drawing a pointy border is easier + height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height width: valueLabel.width + UM.Theme.getSize("default_margin").width Behavior on height { NumberAnimation { duration: 50; } } - color: UM.Theme.getColor("lining"); + color: UM.Theme.getColor("tool_panel_background") + borderColor: UM.Theme.getColor("lining") + borderWidth: UM.Theme.getSize("default_lining").width visible: slider.layersVisible - UM.PointingRectangle + MouseArea //Catch all mouse events (so scene doesnt handle them) { - color: UM.Theme.getColor("tool_panel_background") - target: Qt.point(0, height / 2 + UM.Theme.getSize("default_lining").width) - arrowSize: UM.Theme.getSize("default_arrow").width anchors.fill: parent - anchors.margins: UM.Theme.getSize("default_lining").width - - MouseArea //Catch all mouse events (so scene doesnt handle them) - { - anchors.fill: parent - } } TextField diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 5100a0dacb..1044bfbfcf 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -106,22 +106,13 @@ Item opacity: panel.item && panel.width > 0 ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 100 } } - color: UM.Theme.getColor("lining"); + color: UM.Theme.getColor("tool_panel_background") + borderColor: UM.Theme.getColor("lining") + borderWidth: UM.Theme.getSize("default_lining").width - UM.PointingRectangle + MouseArea //Catch all mouse events (so scene doesnt handle them) { - id: panelBackground; - - color: UM.Theme.getColor("tool_panel_background"); anchors.fill: parent - anchors.margins: UM.Theme.getSize("default_lining").width - - target: Qt.point(-UM.Theme.getSize("default_margin").width, UM.Theme.getSize("button").height/2) - arrowSize: parent.arrowSize - MouseArea //Catch all mouse events (so scene doesnt handle them) - { - anchors.fill: parent - } } Loader From 680cceb6f50aa432b795f241cb520ddf60e6f41c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 16:12:19 +0200 Subject: [PATCH 183/379] Switching to monitor tab now shows the correct sidebar again CURA-3964 --- resources/qml/Cura.qml | 11 ++++++++++- resources/qml/Sidebar.qml | 11 ----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 779bb7d001..9a630da2fa 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -19,6 +19,16 @@ UM.MainWindow title: catalog.i18nc("@title:window","Cura"); viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) property bool monitoringPrint: false + + Connections + { + target: Printer + onShowPrintMonitor: + { + monitoringPrint = show; + } + } + Component.onCompleted: { CuraApplication.setMinimumWindowSize(UM.Theme.getSize("window_minimum_size")) @@ -391,7 +401,6 @@ UM.MainWindow right: parent.right; } z: 1 - onMonitoringPrintChanged: base.monitoringPrint = monitoringPrint width: UM.Theme.getSize("sidebar").width; } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index e446fba653..64127d2163 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -15,18 +15,7 @@ Rectangle id: base; property int currentModeIndex; - property bool monitoringPrint: false; // When adding more "tabs", one want to replace this bool with a ListModel property bool hideSettings: PrintInformation.preSliced - Connections - { - target: Printer - onShowPrintMonitor: - { - base.monitoringPrint = show; - showSettings.checked = !show; - showMonitor.checked = show; - } - } // Is there an output device for this printer? property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 From 68cae135a9c4f5e1efdbfb7b6d0c0f3681549f2f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 3 Jul 2017 16:19:08 +0200 Subject: [PATCH 184/379] Make outer wall line width to evaluate its value accroding to its extruder CURA-3891 This commit fixes the problem that limit to extruder for outer wall doesn't work. --- 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 0760533f33..992424db46 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -677,7 +677,7 @@ "minimum_value_warning": "(0.1 + 0.4 * machine_nozzle_size) if outer_inset_first else 0.1 * machine_nozzle_size", "maximum_value_warning": "2 * machine_nozzle_size", "default_value": 0.4, - "value": "wall_line_width", + "value": "extruderValue(wall_0_extruder_nr, 'wall_line_width')", "type": "float", "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true From 5895f277927dd26d781289631722e1d8e47f1845 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 3 Jul 2017 17:10:59 +0200 Subject: [PATCH 185/379] Revert "Also invert nozzle offset when offsetting machine-specified disallowed areas" This reverts commit 319559740dd8c8c2f9ffad637bee43cef9345073. This was already fixed (line 734 inveted it). This code breaks it when there is no extruder --- cura/BuildVolume.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index de36b80123..53e1471f7b 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager @@ -727,7 +727,7 @@ class BuildVolume(SceneNode): offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") if offset_x is None: offset_x = 0 - offset_y = -extruder.getProperty("machine_nozzle_offset_y", "value") + offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 else: From 1b6152b79333fe6df702c89e3b67689b294a29e9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 4 Jul 2017 09:43:18 +0200 Subject: [PATCH 186/379] Send print times & extruders as string CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index bce98dd681..cab329b6f6 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -121,7 +121,7 @@ class SliceInfo(Extension): "z": bounding_box.maximum.z}} model["transformation"] = {"data": str(node.getWorldTransformation().getData()).replace("\n", "")} extruder_position = node.callDecoration("getActiveExtruderPosition") - model["extruder"] = 0 if extruder_position is None else extruder_position + model["extruder"] = 0 if extruder_position is None else int(extruder_position) model_settings = dict() model_stack = node.callDecoration("getStack") @@ -148,10 +148,10 @@ class SliceInfo(Extension): data["models"].append(model) print_times = print_information.printTimesPerFeature - data["print_times"] = {"travel": print_times["travel"].getDisplayString(DurationFormat.Format.Seconds), - "support": print_times["support"].getDisplayString(DurationFormat.Format.Seconds), - "infill": print_times["infill"].getDisplayString(DurationFormat.Format.Seconds), - "total": print_information.currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)} + data["print_times"] = {"travel": int(print_times["travel"].getDisplayString(DurationFormat.Format.Seconds)), + "support": int(print_times["support"].getDisplayString(DurationFormat.Format.Seconds)), + "infill": int(print_times["infill"].getDisplayString(DurationFormat.Format.Seconds)), + "total": int(print_information.currentPrintTime.getDisplayString(DurationFormat.Format.Seconds))} print_settings = dict() print_settings["layer_height"] = global_container_stack.getProperty("layer_height", "value") From 3ee72a53933654e33a96455a9d3c43f461539d4c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 4 Jul 2017 10:19:11 +0200 Subject: [PATCH 187/379] Fixed sending wrong setting for bed adhesion CURA-3858 --- plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index cab329b6f6..83f17dcb27 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -161,7 +161,7 @@ class SliceInfo(Extension): print_settings["support_extruder_nr"] = int(global_container_stack.getProperty("support_extruder_nr", "value")) # Platform adhesion settings - print_settings["platform_adhesion"] = global_container_stack.getProperty("platform_adhesion", "value") + print_settings["adhesion_type"] = global_container_stack.getProperty("adhesion_type", "value") # Shell settings print_settings["wall_line_count"] = global_container_stack.getProperty("wall_line_count", "value") From ff4935011d5cc129ada83efe5312e5d2b04ab243 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 4 Jul 2017 10:36:45 +0100 Subject: [PATCH 188/379] Tweak description. --- 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 b7bc38764f..0155810acf 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1169,7 +1169,7 @@ "z_seam_relative": { "label": "Z Seam Relative", - "description": "When enabled, the z seam coordinates are relative to each part's centre. By default, the coordinates define an absolute position on the platform.", + "description": "When enabled, the z seam coordinates are relative to each part's centre. When disabled, the coordinates define an absolute position on the build plate.", "unit": "mm", "type": "bool", "default_value": false, From ec25164731084586878975f6eb3c0ec480f8a3d2 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 4 Jul 2017 11:37:04 +0200 Subject: [PATCH 189/379] Cleanup monitoringPrint stuff by properly passing things as properties Instead of relying on the property magically being propagated from the root object, which causes crashes. Contributes to CURA-3964 --- resources/qml/Cura.qml | 10 +++++++--- resources/qml/Sidebar.qml | 2 ++ resources/qml/Topbar.qml | 13 ++++++++----- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 9a630da2fa..4f1e0f34a3 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -18,14 +18,14 @@ UM.MainWindow //: Cura application window title title: catalog.i18nc("@title:window","Cura"); viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) - property bool monitoringPrint: false + property bool showPrintMonitor: false Connections { target: Printer onShowPrintMonitor: { - monitoringPrint = show; + base.showPrintMonitor = show; } } @@ -388,6 +388,9 @@ UM.MainWindow anchors.left:parent.left anchors.right: parent.right anchors.top: parent.top + monitoringPrint: base.showPrintMonitor + onStartMonitoringPrint: base.showPrintMonitor = true + onStopMonitoringPrint: base.showPrintMonitor = false } Sidebar @@ -402,6 +405,7 @@ UM.MainWindow } z: 1 width: UM.Theme.getSize("sidebar").width; + monitoringPrint: base.showPrintMonitor } Button @@ -451,7 +455,7 @@ UM.MainWindow Loader { sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null - visible: base.monitoringPrint + visible: base.showPrintMonitor anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenterOffset: - UM.Theme.getSize("sidebar").width / 2 diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 64127d2163..a1781fe1c5 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -22,6 +22,8 @@ Rectangle property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands property int backendState: UM.Backend.state; + property bool monitoringPrint: false + color: UM.Theme.getColor("sidebar") UM.I18nCatalog { id: catalog; name:"cura"} diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 3c305b522a..1d51c8eccc 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -20,6 +20,9 @@ Rectangle property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + property bool monitoringPrint: false + signal startMonitoringPrint() + signal stopMonitoringPrint() Row { @@ -32,13 +35,13 @@ Rectangle { id: showSettings height: UM.Theme.getSize("sidebar_header").height - onClicked: monitoringPrint = false + onClicked: base.stopMonitoringPrint() iconSource: UM.Theme.getIcon("tab_settings"); property color overlayColor: "transparent" property string overlayIconSource: "" text: "Prepare" checkable: true - checked: !monitoringPrint + checked: !base.monitoringPrint exclusiveGroup: sidebarHeaderBarGroup style: UM.Theme.styles.topbar_header_tab @@ -48,7 +51,7 @@ Rectangle { id: showMonitor height: UM.Theme.getSize("sidebar_header").height - onClicked: monitoringPrint = true + onClicked: base.startMonitoringPrint() text: "Print" iconSource: printerConnected ? UM.Theme.getIcon("tab_monitor_with_status") : UM.Theme.getIcon("tab_monitor") property color overlayColor: @@ -122,7 +125,7 @@ Rectangle } checkable: true - checked: monitoringPrint + checked: base.monitoringPrint exclusiveGroup: sidebarHeaderBarGroup style: UM.Theme.styles.topbar_header_tab @@ -205,4 +208,4 @@ Rectangle menu: PrinterMenu { } } -} \ No newline at end of file +} From b2a263b2db843c1c6e947a6594eff96047f462cd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 4 Jul 2017 11:38:53 +0200 Subject: [PATCH 190/379] Enable support_infill_sparse_thickness when support is enabled CURA-2724 --- 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 509bd4010c..6784113225 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3417,7 +3417,7 @@ "maximum_value_warning": "0.75 * machine_nozzle_size", "maximum_value": "resolveOrValue('layer_height') * 8", "value": "resolveOrValue('layer_height')", - "enabled": "support_infill_rate > 0", + "enabled": "support_enable and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, From 5fa2ba60520911c254035d1a7420cfeb126baf66 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 4 Jul 2017 11:55:24 +0200 Subject: [PATCH 191/379] Undo for material diameter also changes the property. It used to only set the metadata. CURA-2822 --- cura/Settings/MaterialManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/MaterialManager.py b/cura/Settings/MaterialManager.py index 8bb7b525f8..5640d7af38 100644 --- a/cura/Settings/MaterialManager.py +++ b/cura/Settings/MaterialManager.py @@ -51,6 +51,7 @@ class MaterialManager(QObject): container_manager.setContainerMetaDataEntry(self._material_diameter_warning_message.material_id, "properties/diameter", self._material_diameter_warning_message.previous_diameter) approximate_previous_diameter = str(round(float(self._material_diameter_warning_message.previous_diameter))) container_manager.setContainerMetaDataEntry(self._material_diameter_warning_message.material_id, "approximate_diameter", approximate_previous_diameter) + container_manager.setContainerProperty(self._material_diameter_warning_message.material_id, "material_diameter", "value", self._material_diameter_warning_message.previous_diameter); message.hide() else: Logger.log("w", "Unknown button action for material diameter warning message: {action}".format(action = button)) \ No newline at end of file From 1627a655132d566ff189b50a1e806f2e3567ba89 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 4 Jul 2017 11:58:04 +0200 Subject: [PATCH 192/379] Viewport overlay now shows correctly when switching between monitor & settings CURA-3964 --- resources/qml/Cura.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 4f1e0f34a3..b1e5c8f2f2 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -440,7 +440,7 @@ UM.MainWindow right: sidebar.left } visible: opacity > 0 - opacity: base.monitoringPrint ? 0.75 : 0 + opacity: base.showPrintMonitor ? 0.75 : 0 Behavior on opacity { NumberAnimation { duration: 100; } } From 88ee878423b2d47c0bf7a3df798fa04eab609ec6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 4 Jul 2017 12:33:19 +0200 Subject: [PATCH 193/379] Simplify inheritance formula for prime tower wall thickness Firstly, all the resolveOrValue calls are identity functions now so they can be phased out. Secondly, all the max(extruderValues(...)) should be done by the resolve property rather than the value property. The resolve property already makes sure that the prime tower is evenly thick for every extruder, so it doesn't need to ensure this in the value function as well. Contributes to issue CURA-3521. --- 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 992424db46..563ac957e4 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4371,7 +4371,7 @@ "unit": "mm", "type": "float", "default_value": 2, - "value": "round(max(2 * max(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(max(0, resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height'))))), 3)", + "value": "round(max(2 * prime_tower_line_width, 0.5 * (prime_tower_size - math.sqrt(max(0, prime_tower_size ** 2 - prime_tower_min_volume / layer_height)))), 3)", "resolve": "max(extruderValues('prime_tower_wall_thickness'))", "minimum_value": "0.001", "minimum_value_warning": "2 * min(extruderValues('prime_tower_line_width')) - 0.0001", From d3fc47fb42570cc23275bd75033c85ea5004a57d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 4 Jul 2017 12:36:18 +0200 Subject: [PATCH 194/379] Remove nonsensical warning values for prime tower position I discovered this during work on CURA-3521. --- 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 563ac957e4..131ce22a8c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4390,8 +4390,6 @@ "unit": "mm", "enabled": "resolveOrValue('prime_tower_enable')", "default_value": 200, - "minimum_value_warning": "-1000", - "maximum_value_warning": "1000", "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, @@ -4405,8 +4403,6 @@ "unit": "mm", "enabled": "resolveOrValue('prime_tower_enable')", "default_value": 200, - "minimum_value_warning": "-1000", - "maximum_value_warning": "1000", "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 d0ef97b02c41baf0970dcaba2181a554f5c3a531 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 4 Jul 2017 13:06:11 +0200 Subject: [PATCH 195/379] Remove invalid anchoring for SidebarHeader CURA-3964 sidebarHeaderBar has been removed and the anchor line is not needed. --- resources/qml/Sidebar.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index a1781fe1c5..b57b56c292 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -83,8 +83,6 @@ Rectangle id: header width: parent.width - anchors.top: sidebarHeaderBar.bottom - onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() } From 19495de7e82de32bccf5b79cad06a94d3d7b7d74 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 4 Jul 2017 13:24:12 +0200 Subject: [PATCH 196/379] Fix machine_nozzle_offset_y value CURA-3964 This is such an obvious bug... --- cura/BuildVolume.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index de36b80123..046fb505cc 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -727,7 +727,7 @@ class BuildVolume(SceneNode): offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") if offset_x is None: offset_x = 0 - offset_y = -extruder.getProperty("machine_nozzle_offset_y", "value") + offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 else: From b66f9a0da41bc4b755428aea910afbdcb36cee8c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 4 Jul 2017 13:50:19 +0200 Subject: [PATCH 197/379] Invert enabled condition on spaghetti_infill_stepped These two settings are only relevant if the spaghetti infill is stepped, not when it's not stepped. Contributes to issue CURA-3861. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 329daa5fa6..0456eb95b1 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4931,7 +4931,7 @@ "minimum_value": "0", "maximum_value": "90", "maximum_value_warning": "45", - "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled and not spaghetti_infill_stepped", + "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled and spaghetti_infill_stepped", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, @@ -4944,7 +4944,7 @@ "default_value": 2.0, "minimum_value": "layer_height", "maximum_value_warning": "10.0", - "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled and not spaghetti_infill_stepped", + "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled and spaghetti_infill_stepped", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, From 194d7bb3b81b99a4241b10abf43da9fa39a62ccc Mon Sep 17 00:00:00 2001 From: maukcc Date: Tue, 4 Jul 2017 14:58:01 +0200 Subject: [PATCH 198/379] Cartesio profiles update Cartesio disalowed areas Cartesio extruder offsets Cartesio high quality profiles --- resources/definitions/cartesio.def.json | 6 +++++- resources/extruders/cartesio_extruder_2.def.json | 2 +- resources/extruders/cartesio_extruder_3.def.json | 4 ++-- .../quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg | 2 +- .../quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg | 2 +- .../quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg | 2 +- .../cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg | 2 +- .../quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg | 2 +- .../quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg | 2 +- .../quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg | 2 +- .../cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg | 2 +- .../quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg | 2 +- .../quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg | 2 +- resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg | 2 +- resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg | 2 +- .../quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg | 2 +- .../quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg | 2 +- .../quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg | 2 +- .../quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg | 2 +- .../quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg | 2 +- .../quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg | 2 +- .../quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg | 2 +- .../quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg | 2 +- .../quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg | 2 +- 25 files changed, 30 insertions(+), 26 deletions(-) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index 52d32630ff..d065d6a7c6 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -50,11 +50,15 @@ "prime_tower_wall_thickness": { "resolve": 0.7 }, "prime_tower_position_x": { "default_value": 50 }, "prime_tower_position_y": { "default_value": 150 }, + "machine_max_feedrate_z": { "default_value": 20 }, + "machine_disallowed_areas": { "default_value": [ + [[215, 135], [-215, 135], [-215, 75], [215, 75]] + ]}, "machine_start_gcode": { "default_value": "\nM92 E159 ;2288 for V5 extruder\n\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nG21\nG90\nM42 S255 P13 ;chamber lights\nM42 S255 P12 ;fume extraction\nM204 S300 ;default acceleration\nM205 X10 ;default jerk\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" }, "machine_end_gcode": { - "default_value": "; -- END GCODE --\nM106 S255\nM140 S5\nM104 S5 T0\nM104 S5 T1\nM104 S5 T2\nM104 S5 T3\n\nG91\nG1 Z1 F900\nG90\n\nG1 X20.0 Y260.0 F6000\nG4 S7\nM84\nG4 S90\nM107\nM42 P12 S0\nM42 P13 S0\nM84\nT0\n; -- end of GCODE --" + "default_value": "; -- END GCODE --\nM117 cooling down....\nM106 S255\nM140 S5\nM104 S5 T0\nM104 S5 T1\nM104 S5 T2\nM104 S5 T3\n\nG91\nG1 Z1 F900\nG90\n\nG1 X20.0 Y260.0 F6000\nG4 S7\nM84\nG4 S90\nM107\nM42 P12 S0\nM42 P13 S0\nM84\nT0\nM117 Finished.\n; -- end of GCODE --" }, "layer_height": { "maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" }, "layer_height_0": { "maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" }, diff --git a/resources/extruders/cartesio_extruder_2.def.json b/resources/extruders/cartesio_extruder_2.def.json index ce07502943..c4ad94f635 100644 --- a/resources/extruders/cartesio_extruder_2.def.json +++ b/resources/extruders/cartesio_extruder_2.def.json @@ -14,7 +14,7 @@ "maximum_value": "3" }, "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 60.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_extruder_start_code": { "default_value": "\n;start extruder_2\n\nM117 printing\n" }, diff --git a/resources/extruders/cartesio_extruder_3.def.json b/resources/extruders/cartesio_extruder_3.def.json index dea3467daa..589942fc6d 100644 --- a/resources/extruders/cartesio_extruder_3.def.json +++ b/resources/extruders/cartesio_extruder_3.def.json @@ -13,8 +13,8 @@ "default_value": 3, "maximum_value": "3" }, - "machine_nozzle_offset_x": { "default_value": 24.0 }, - "machine_nozzle_offset_y": { "default_value": 60.0 }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_extruder_start_code": { "default_value": "\n;start extruder_3\n\nM117 printing\n" }, diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg index 1c5a222dad..374856930f 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg index 0a47ae7697..100ccbd3af 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg index 4025bc2cb2..340628f3d2 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg index cf7774445b..3f22cb241f 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 25 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg index 184b097ee8..a9ef5cd73c 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg index ee21935f5b..bfcfd35709 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg index 90020ffa3e..341e973772 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg index babe2ef7e9..560a9dd2aa 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg index 6a99be39f8..0e63fd2475 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg index 8ac54aaca2..e87db87ff2 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg index 47db068af9..1c5f445056 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg index 345ecea394..fc7c7dd28e 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg index d942415e64..334d70b84f 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg index 037456bc72..ffe5a44a90 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg index 4a4d8cf69f..c16885bbd4 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg index 291cf071d7..30983af053 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg index c7d0432443..ce8503fe31 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg index 816d0f0304..ad2faf285c 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg index da9515d387..a847ed83a7 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg index ddd097875b..ac0b958e04 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg index 0c6f6813ea..f8e44e4531 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg index cfdfdbc708..dfabaa65d6 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg @@ -35,7 +35,7 @@ speed_print = 50 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) -speed_wall_0 = =10 if speed_wall < 11 else (speed_print / 5 *3) +speed_wall_0 = =10 if speed_wall < 11 else 15 speed_topbottom = =round(speed_print / 5 * 4) speed_travel = =round(speed_print if magic_spiralize else 150) speed_travel_layer_0 = =speed_travel From 289c9ed8ee2b57a3e762b292fce416196e51a6e3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 5 Jul 2017 11:00:00 +0200 Subject: [PATCH 199/379] Network printing now sees empty state as idle --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 2a9dedc20c..b309691e81 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -625,7 +625,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): # is ignored. # \param kwargs Keyword arguments. def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): - if self._printer_state != "idle": + if self._printer_state not in ["idle", ""]: self._error_message = Message( i18n_catalog.i18nc("@info:status", "Unable to start a new print job, printer is busy. Current printer status is %s.") % self._printer_state) self._error_message.show() From ef51897b716ecb42aedef12932f9df2e965f3f5e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 5 Jul 2017 14:48:02 +0200 Subject: [PATCH 200/379] Fixed removable drive error spam on Windows --- .../WindowsRemovableDrivePlugin.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py index 42f3935f65..1c15990bf1 100644 --- a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py @@ -1,19 +1,18 @@ # Copyright (c) 2015 Ultimaker B.V. # Copyright (c) 2013 David Braam # Uranium is released under the terms of the AGPLv3 or higher. - -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - from . import RemovableDrivePlugin import string -import ctypes # type: ignore -from ctypes import wintypes # Using ctypes.wintypes in the code below does not seem to work +import ctypes +from ctypes import wintypes # Using ctypes.wintypes in the code below does not seem to work from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") +# Ignore windows error popups. Fixes the whole "Can't open drive X" when user has an SD card reader. +ctypes.windll.kernel32.SetErrorMode(1) + # WinAPI Constants that we need # Hardcoded here due to stupid WinDLL stuff that does not give us access to these values. DRIVE_REMOVABLE = 2 # [CodeStyle: Windows Enum value] From f81be9e627a6aba56fc75cb8f469f1bc172276ba Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Wed, 5 Jul 2017 14:36:21 +0100 Subject: [PATCH 201/379] Added RepRap (RepRap) gcode flavor. --- 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 5af9e4aec4..295add3c42 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -304,6 +304,7 @@ "options": { "RepRap (Marlin/Sprinter)": "RepRap (Marlin/Sprinter)", + "RepRap (RepRap)": "RepRap (RepRap)", "RepRap (Volumatric)": "RepRap (Volumetric)", "UltiGCode": "Ultimaker 2", "Griffin": "Griffin", From 9dd352750488cd700704511c90bc1f36b24be0cd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Jul 2017 16:03:57 +0200 Subject: [PATCH 202/379] Blur setting text fields when clicking buttons Otherwise the setting is not applied yet by the time you duplicate or export a profile. Contributes to issue CURA-4011. --- resources/qml/Preferences/MaterialsPage.qml | 25 ++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index e5051dd5d3..b4ee4d5c49 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -1,5 +1,5 @@ -// Copyright (c) 2016 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. +//Copyright (c) 2017 Ultimaker B.V. +//Cura is released under the terms of the AGPLv3 or higher. import QtQuick 2.1 import QtQuick.Controls 1.1 @@ -139,6 +139,7 @@ UM.ManagementPage enabled: base.currentItem != null && base.currentItem.id != Cura.MachineManager.activeMaterialId && Cura.MachineManager.hasMaterials onClicked: { + forceActiveFocus(); Cura.MachineManager.setActiveMaterial(base.currentItem.id) currentItem = base.model.getItem(base.objectList.currentIndex) // Refresh the current item. } @@ -149,6 +150,7 @@ UM.ManagementPage iconName: "list-add" onClicked: { + forceActiveFocus(); var material_id = Cura.ContainerManager.createMaterial() if(material_id == "") { @@ -168,6 +170,7 @@ UM.ManagementPage enabled: base.currentItem != null onClicked: { + forceActiveFocus(); var base_file = Cura.ContainerManager.getContainerMetaDataEntry(base.currentItem.id, "base_file") // We need to copy the base container instead of the specific variant. var material_id = base_file == "" ? Cura.ContainerManager.duplicateMaterial(base.currentItem.id): Cura.ContainerManager.duplicateMaterial(base_file) @@ -187,20 +190,32 @@ UM.ManagementPage text: catalog.i18nc("@action:button", "Remove"); iconName: "list-remove"; enabled: base.currentItem != null && !base.currentItem.readOnly && !Cura.ContainerManager.isContainerUsed(base.currentItem.id) - onClicked: confirmDialog.open() + onClicked: + { + forceActiveFocus(); + confirmDialog.open(); + } }, Button { text: catalog.i18nc("@action:button", "Import"); iconName: "document-import"; - onClicked: importDialog.open(); + onClicked: + { + forceActiveFocus(); + importDialog.open(); + } visible: true; }, Button { text: catalog.i18nc("@action:button", "Export") iconName: "document-export" - onClicked: exportDialog.open() + onClicked: + { + forceActiveFocus(); + exportDialog.open(); + } enabled: currentItem != null } ] From 271d4a30f06964f0bd85e6a46f712f95e7ed2400 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Jul 2017 16:22:24 +0200 Subject: [PATCH 203/379] Set Support Z Distance equal to what it's at for UM3 The old value was giving a warning and the new value was better tested for UM3. We knew that this was sorta wrong. Suggested by the materials team. --- resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg | 2 +- resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg | 3 +-- resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg index ed526b705c..36a8c479a7 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg @@ -31,7 +31,7 @@ infill_sparse_density = 10 cool_fan_speed = 60 speed_travel = 150 speed_support = 40 -support_z_distance = 0.45 +support_z_distance = =layer_height * 2 cool_fan_speed_min = =cool_fan_speed * 35 / 60 brim_line_count = 8 retraction_hop_enabled = 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg index 76f09c0db9..00e4b59181 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg @@ -13,7 +13,7 @@ setting_version = 1 [values] support_xy_distance = 0.65 speed_travel = 150 -support_z_distance = 0.45 +support_z_distance = =layer_height * 2 speed_wall_x = 35 cool_min_speed = 15 cool_fan_speed = 60 @@ -37,4 +37,3 @@ speed_print = 40 support_angle = 45 cool_min_layer_time = 10 raft_base_line_width = 0.8 - diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg index 22fda17c62..ed15c13f94 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg @@ -33,7 +33,7 @@ support_angle = 45 infill_sparse_density = 10 cool_fan_speed = 60 speed_support = 40 -support_z_distance = 0.45 +support_z_distance = =layer_height * 2 cool_fan_speed_min = =cool_fan_speed * 35 / 60 brim_line_count = 8 retraction_hop_enabled = 0.2 From 8955249ea97d3ed1fd1ed4249db8bf13bc856800 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 6 Jul 2017 08:24:23 +0100 Subject: [PATCH 204/379] Change gcode flavor labels to make it obvious which firmwares they are targetting. Rename "RepRap (Marlin/Sprinter)" to "Marlin". Rename "RepRap (Volumetric)" to "Marlin (Volumetric)". Rename "RepRap (RepRap)" to "RepRap". --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 295add3c42..370b171ebd 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -303,9 +303,9 @@ "type": "enum", "options": { - "RepRap (Marlin/Sprinter)": "RepRap (Marlin/Sprinter)", - "RepRap (RepRap)": "RepRap (RepRap)", - "RepRap (Volumatric)": "RepRap (Volumetric)", + "RepRap (Marlin/Sprinter)": "Marlin", + "RepRap (Volumatric)": "Marlin (Volumetric)", + "RepRap (RepRap)": "RepRap", "UltiGCode": "Ultimaker 2", "Griffin": "Griffin", "Makerbot": "Makerbot", From bb68f488dbf9af533b59b11ae3908e5c9b137e3a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 6 Jul 2017 09:41:28 +0200 Subject: [PATCH 205/379] Make material finding more robust The .findContainer technique is obsolete since we now just have a field for this. Hopefully contributes to issue #2053. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index ecaebb816d..58c75fff3f 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -173,19 +173,16 @@ class ProcessSlicedLayersJob(Job): if extruders: material_color_map = numpy.zeros((len(extruders), 4), dtype=numpy.float32) for extruder in extruders: - material = extruder.findContainer({"type": "material"}) position = int(extruder.getMetaDataEntry("position", default="0")) # Get the position - color_code = material.getMetaDataEntry("color_code", default="#e0e000") + color_code = extruder.material.getMetaDataEntry("color_code", default="#e0e000") color = colorCodeToRGBA(color_code) material_color_map[position, :] = color else: # Single extruder via global stack. material_color_map = numpy.zeros((1, 4), dtype=numpy.float32) - material = global_container_stack.findContainer({"type": "material"}) color_code = "#e0e000" - if material: - if material.getMetaDataEntry("color_code") is not None: - color_code = material.getMetaDataEntry("color_code") + if global_container_stack.material.getMetaDataEntry("color_code") is not None: + color_code = global_container_stack.material.getMetaDataEntry("color_code") color = colorCodeToRGBA(color_code) material_color_map[0, :] = color From 6cac15de7d9b9eaf98fd8bef291ba4b6f0470791 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 6 Jul 2017 09:48:36 +0200 Subject: [PATCH 206/379] Use default parameter to obtain default colour There is a built-in mechanism for this, so we don't need to do this ourselves. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 58c75fff3f..15cda75eb8 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -1,5 +1,5 @@ -# Copyright (c) 2016 Ultimaker B.V. -# Cura is released under the terms of the AGPLv3 or higher. +#Copyright (c) 2017 Ultimaker B.V. +#Cura is released under the terms of the AGPLv3 or higher. import gc @@ -180,9 +180,7 @@ class ProcessSlicedLayersJob(Job): else: # Single extruder via global stack. material_color_map = numpy.zeros((1, 4), dtype=numpy.float32) - color_code = "#e0e000" - if global_container_stack.material.getMetaDataEntry("color_code") is not None: - color_code = global_container_stack.material.getMetaDataEntry("color_code") + color_code = global_container_stack.material.getMetaDataEntry("color_code", default="#e0e000") color = colorCodeToRGBA(color_code) material_color_map[0, :] = color From 2cab0977160a40862f885eb703664591749198bf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 5 Jul 2017 15:28:08 +0200 Subject: [PATCH 207/379] Rename "Not Supported" quality files CURA-3975 Rename quality profiles with name "Not Supported" to have actual quality names. Note that the "Not Supported" only ones are renamed to "Fast_Print". --- ...pported_Quality.inst.cfg => um3_aa0.4_PVA_Fast_Print.inst.cfg} | 0 ...ported_Quality.inst.cfg => um3_aa0.8_CPEP_Fast_Print.inst.cfg} | 0 ..._Quality.inst.cfg => um3_aa0.8_CPEP_Superdraft_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_aa0.8_CPEP_Verydraft_Print.inst.cfg} | 0 ...upported_Quality.inst.cfg => um3_aa0.8_PC_Fast_Print.inst.cfg} | 0 ...ft_Quality.inst.cfg => um3_aa0.8_PC_Superdraft_Print.inst.cfg} | 0 ...aft_Quality.inst.cfg => um3_aa0.8_PC_Verydraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_aa0.8_PVA_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_aa0.8_PVA_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.4_ABS_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.4_ABS_Superdraft_Print.inst.cfg} | 0 ...ported_Quality.inst.cfg => um3_bb0.4_CPEP_Fast_Print.inst.cfg} | 0 ..._Quality.inst.cfg => um3_bb0.4_CPEP_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.4_CPE_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.4_CPE_Superdraft_Print.inst.cfg} | 0 ...orted_Quality.inst.cfg => um3_bb0.4_Nylon_Fast_Print.inst.cfg} | 0 ...Quality.inst.cfg => um3_bb0.4_Nylon_Superdraft_Print.inst.cfg} | 0 ...upported_Quality.inst.cfg => um3_bb0.4_PC_Fast_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.4_PLA_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.4_PLA_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.4_TPU_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.4_TPU_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.8_ABS_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.8_ABS_Superdraft_Print.inst.cfg} | 0 ...ported_Quality.inst.cfg => um3_bb0.8_CPEP_Fast_Print.inst.cfg} | 0 ..._Quality.inst.cfg => um3_bb0.8_CPEP_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.8_CPE_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.8_CPE_Superdraft_Print.inst.cfg} | 0 ...orted_Quality.inst.cfg => um3_bb0.8_Nylon_Fast_Print.inst.cfg} | 0 ...Quality.inst.cfg => um3_bb0.8_Nylon_Superdraft_Print.inst.cfg} | 0 ...upported_Quality.inst.cfg => um3_bb0.8_PC_Fast_Print.inst.cfg} | 0 ...ft_Quality.inst.cfg => um3_bb0.8_PC_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.8_PLA_Fast_Print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.8_PLA_Superdraft_Print.inst.cfg} | 0 ...pported_Quality.inst.cfg => um3_bb0.8_TPU_Fast_print.inst.cfg} | 0 ...t_Quality.inst.cfg => um3_bb0.8_TPU_Superdraft_Print.inst.cfg} | 0 36 files changed, 0 insertions(+), 0 deletions(-) rename resources/quality/ultimaker3/{um3_aa0.4_PVA_Not_Supported_Quality.inst.cfg => um3_aa0.4_PVA_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg => um3_aa0.8_CPEP_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg => um3_aa0.8_CPEP_Superdraft_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg => um3_aa0.8_CPEP_Verydraft_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PC_Not_Supported_Quality.inst.cfg => um3_aa0.8_PC_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg => um3_aa0.8_PC_Superdraft_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg => um3_aa0.8_PC_Verydraft_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_aa0.8_PVA_Not_Supported_Quality.inst.cfg => um3_aa0.8_PVA_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_aa0.8_PVA_Not_Supported_Superdraft_Quality.inst.cfg => um3_aa0.8_PVA_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_ABS_Not_Supported_Quality.inst.cfg => um3_bb0.4_ABS_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_bb0.4_ABS_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.4_ABS_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_CPEP_Not_Supported_Quality.inst.cfg => um3_bb0.4_CPEP_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_CPEP_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.4_CPEP_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_CPE_Not_Supported_Quality.inst.cfg => um3_bb0.4_CPE_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_bb0.4_CPE_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.4_CPE_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_Nylon_Not_Supported_Quality.inst.cfg => um3_bb0.4_Nylon_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_bb0.4_Nylon_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.4_Nylon_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_PC_Not_Supported_Quality.inst.cfg => um3_bb0.4_PC_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_PLA_Not_Supported_Quality.inst.cfg => um3_bb0.4_PLA_Fast_Print.inst.cfg} (100%) rename resources/quality/ultimaker3/{um3_bb0.4_PLA_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.4_PLA_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_TPU_Not_Supported_Quality.inst.cfg => um3_bb0.4_TPU_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.4_TPU_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.4_TPU_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_ABS_Not_Supported_Quality.inst.cfg => um3_bb0.8_ABS_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_ABS_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_ABS_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_CPEP_Not_Supported_Quality.inst.cfg => um3_bb0.8_CPEP_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_CPEP_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_CPE_Not_Supported_Quality.inst.cfg => um3_bb0.8_CPE_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_CPE_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_CPE_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_Nylon_Not_Supported_Quality.inst.cfg => um3_bb0.8_Nylon_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_Nylon_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_Nylon_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_PC_Not_Supported_Quality.inst.cfg => um3_bb0.8_PC_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_PC_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_PLA_Not_Supported_Quality.inst.cfg => um3_bb0.8_PLA_Fast_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_PLA_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_PLA_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_TPU_Not_Supported_Quality.inst.cfg => um3_bb0.8_TPU_Fast_print.inst.cfg} (100%) mode change 100755 => 100644 rename resources/quality/ultimaker3/{um3_bb0.8_TPU_Not_Supported_Superdraft_Quality.inst.cfg => um3_bb0.8_TPU_Superdraft_Print.inst.cfg} (100%) mode change 100755 => 100644 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PVA_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.4_PVA_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PC_Not_Supported_Verydraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PVA_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_aa0.8_PVA_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_ABS_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_ABS_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_ABS_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_ABS_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_CPEP_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_CPEP_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPE_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_CPE_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPE_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_CPE_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_Nylon_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_Nylon_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_PC_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_PC_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_PLA_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_PLA_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_PLA_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_PLA_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_TPU_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_TPU_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.4_TPU_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.4_TPU_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_ABS_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_ABS_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_ABS_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_ABS_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_CPEP_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_CPEP_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPE_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_CPE_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPE_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_CPE_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_Nylon_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_Nylon_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_PC_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_PC_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_PC_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_PLA_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_PLA_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_PLA_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_PLA_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_TPU_Not_Supported_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_TPU_Not_Supported_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg diff --git a/resources/quality/ultimaker3/um3_bb0.8_TPU_Not_Supported_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg old mode 100755 new mode 100644 similarity index 100% rename from resources/quality/ultimaker3/um3_bb0.8_TPU_Not_Supported_Superdraft_Quality.inst.cfg rename to resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg From afb923401e347b01f83d4e87a975515b528c2610 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 5 Jul 2017 16:27:48 +0200 Subject: [PATCH 208/379] Set versions correctly for container stacks and preferences CURA-3975 The upgrade for machine and extruder stacks and the preferences files don't work because the current version registering doesn't take into account the 1000000 multiplier and the settings_version. --- cura/CuraApplication.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a1f5aaa6de..2683c48108 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -179,9 +179,9 @@ class CuraApplication(QtApplication): UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions( { ("quality_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), - ("machine_stack", ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), - ("extruder_train", ContainerStack.Version): (self.ResourceTypes.ExtruderStack, "application/x-uranium-extruderstack"), - ("preferences", Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences"), + ("machine_stack", ContainerStack.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), + ("extruder_train", ContainerStack.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.ExtruderStack, "application/x-uranium-extruderstack"), + ("preferences", Preferences.Version * 1000000 + self.SettingVersion): (Resources.Preferences, "application/x-uranium-preferences"), ("user", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer"), ("definition_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.DefinitionChangesContainer, "application/x-uranium-instancecontainer"), } From 16a078b9a66b7cf77b1bfd5c2a134f0be058f15e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 10:22:15 +0200 Subject: [PATCH 209/379] Update SettingVersion to 2 for renaming the quality profiles CURA-3975 Update SettingVersion to 2 so we can create an upgrade to rename the quality profiles. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2683c48108..99fb4f8a05 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -105,7 +105,7 @@ class CuraApplication(QtApplication): # SettingVersion represents the set of settings available in the machine/extruder definitions. # You need to make sure that this version number needs to be increased if there is any non-backwards-compatible # changes of the settings. - SettingVersion = 1 + SettingVersion = 2 class ResourceTypes: QmlFiles = Resources.UserType + 1 From 42858b47152060557d9258744ff1538e2dd64697 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 10:22:31 +0200 Subject: [PATCH 210/379] Add upgrade script for 2.6 to 2.7 to rename quality profiles CURA-3975 --- .../VersionUpgrade26to27.py | 120 +++++++++++ .../VersionUpgrade26to27/__init__.py | 31 +++ .../VersionUpgrade26to27/plugin.json | 8 + .../tests/TestVersionUpgrade26to27.py | 191 ++++++++++++++++++ 4 files changed, 350 insertions(+) create mode 100644 plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json create mode 100644 plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py new file mode 100644 index 0000000000..c0e085bcfb --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py @@ -0,0 +1,120 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import configparser #To parse the files we need to upgrade and write the new files. +import io #To serialise configparser output to a string. + +from UM.VersionUpgrade import VersionUpgrade +from cura.CuraApplication import CuraApplication + +# a dict of renamed quality profiles: : +_renamed_quality_profiles = { + "um3_aa0.4_PVA_Not_Supported_Quality": "um3_aa0.4_PVA_Fast_Print", + + "um3_aa0.8_CPEP_Not_Supported_Quality": "um3_aa0.8_CPEP_Fast_Print", + "um3_aa0.8_CPEP_Not_Supported_Superdraft_Quality": "um3_aa0.8_CPEP_Superdraft_Print", + "um3_aa0.8_CPEP_Not_Supported_Verydraft_Quality": "um3_aa0.8_CPEP_Verydraft_Print", + + "um3_aa0.8_PC_Not_Supported_Quality": "um3_aa0.8_PC_Fast_Print", + "um3_aa0.8_PC_Not_Supported_Superdraft_Quality": "um3_aa0.8_PC_Superdraft_Print", + "um3_aa0.8_PC_Not_Supported_Verydraft_Quality": "um3_aa0.8_PC_Verydraft_Print", + + "um3_aa0.8_PVA_Not_Supported_Quality": "um3_aa0.8_PVA_Fast_Print", + "um3_aa0.8_PVA_Not_Supported_Superdraft_Quality": "um3_aa0.8_PVA_Superdraft_Print", + + "um3_bb0.4_ABS_Not_Supported_Quality": "um3_bb0.4_ABS_Fast_print", + "um3_bb0.4_ABS_Not_Supported_Superdraft_Quality": "um3_bb0.4_ABS_Superdraft_Print", + + "um3_bb0.4_CPE_Not_Supported_Quality": "um3_bb0.4_CPE_Fast_Print", + "um3_bb0.4_CPE_Not_Supported_Superdraft_Quality": "um3_bb0.4_CPE_Superdraft_Print", + + "um3_bb0.4_CPEP_Not_Supported_Quality": "um3_bb0.4_CPEP_Fast_Print", + "um3_bb0.4_CPEP_Not_Supported_Superdraft_Quality": "um3_bb0.4_CPEP_Superdraft_Print", + + "um3_bb0.4_Nylon_Not_Supported_Quality": "um3_bb0.4_Nylon_Fast_Print", + "um3_bb0.4_Nylon_Not_Supported_Superdraft_Quality": "um3_bb0.4_Nylon_Superdraft_Print", + + "um3_bb0.4_PC_Not_Supported_Quality": "um3_bb0.4_PC_Fast_Print", + + "um3_bb0.4_PLA_Not_Supported_Quality": "um3_bb0.4_PLA_Fast_Print", + "um3_bb0.4_PLA_Not_Supported_Superdraft_Quality": "um3_bb0.4_PLA_Superdraft_Print", + + "um3_bb0.4_TPU_Not_Supported_Quality": "um3_bb0.4_TPU_Fast_Print", + "um3_bb0.4_TPU_Not_Supported_Superdraft_Quality": "um3_bb0.4_TPU_Superdraft_Print", + + "um3_bb0.8_ABS_Not_Supported_Quality": "um3_bb0.8_ABS_Fast_Print", + "um3_bb0.8_ABS_Not_Supported_Superdraft_Quality": "um3_bb0.8_ABS_Superdraft_Print", + + "um3_bb0.8_CPE_Not_Supported_Quality": "um3_bb0.8_CPE_Fast_Print", + "um3_bb0.8_CPE_Not_Supported_Superdraft_Quality": "um3_bb0.8_CPE_Superdraft_Print", + + "um3_bb0.8_CPEP_Not_Supported_Quality": "um3_bb0.um3_bb0.8_CPEP_Fast_Print", + "um3_bb0.8_CPEP_Not_Supported_Superdraft_Quality": "um3_bb0.8_CPEP_Superdraft_Print", + + "um3_bb0.8_Nylon_Not_Supported_Quality": "um3_bb0.8_Nylon_Fast_Print", + "um3_bb0.8_Nylon_Not_Supported_Superdraft_Quality": "um3_bb0.8_Nylon_Superdraft_Print", + + "um3_bb0.8_PC_Not_Supported_Quality": "um3_bb0.8_PC_Fast_Print", + "um3_bb0.8_PC_Not_Supported_Superdraft_Quality": "um3_bb0.8_PC_Superdraft_Print", + + "um3_bb0.8_PLA_Not_Supported_Quality": "um3_bb0.8_PLA_Fast_Print", + "um3_bb0.8_PLA_Not_Supported_Superdraft_Quality": "um3_bb0.8_PLA_Superdraft_Print", + + "um3_bb0.8_TPU_Not_Supported_Quality": "um3_bb0.8_TPU_Fast_print", + "um3_bb0.8_TPU_Not_Supported_Superdraft_Quality": "um3_bb0.8_TPU_Superdraft_Print", +} + +## A collection of functions that convert the configuration of the user in Cura +# 2.6 to a configuration for Cura 2.7. +# +# All of these methods are essentially stateless. +class VersionUpgrade26to27(VersionUpgrade): + ## Gets the version number from a CFG file in Uranium's 2.6 format. + # + # Since the format may change, this is implemented for the 2.6 format only + # and needs to be included in the version upgrade system rather than + # globally in Uranium. + # + # \param serialised The serialised form of a CFG file. + # \return The version number stored in the CFG file. + # \raises ValueError The format of the version number in the file is + # incorrect. + # \raises KeyError The format of the file is incorrect. + def getCfgVersion(self, serialised): + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialised) + format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised. + setting_version = int(parser.get("metadata", "setting_version", fallback = 0)) + return format_version * 1000000 + setting_version + + ## Upgrades a container stack from version 2.6 to 2.7. + # + # \param serialised The serialised form of a container stack. + # \param filename The name of the file to upgrade. + def upgradeStack(self, serialised, filename): + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialised) + + # Update IDs of the renamed quality profiles + if parser.has_section("containers"): + key_list = [key for key in parser["containers"].keys()] + for key in key_list: + container_id = parser.get("containers", key) + new_id = _renamed_quality_profiles.get(container_id) + if new_id is not None: + parser.set("containers", key, new_id) + + for each_section in ("general", "metadata"): + if not parser.has_section(each_section): + parser.add_section(each_section) + + # Change the version number in the file. + parser["metadata"]["setting_version"] = str(CuraApplication.SettingVersion) + + # Update version + parser["general"]["version"] = "4" + + # Re-serialise the file. + output = io.StringIO() + parser.write(output) + return [filename], [output.getvalue()] diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py new file mode 100644 index 0000000000..8ddf4aa7ea --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py @@ -0,0 +1,31 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from . import VersionUpgrade26to27 + +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +upgrade = VersionUpgrade26to27.VersionUpgrade26to27() + +def getMetaData(): + return { + "version_upgrade": { + # From To Upgrade function + ("machine_stack", 3000000): ("machine_stack", 3000002, upgrade.upgradeStack), + ("extruder_train", 3000000): ("extruder_train", 3000002, upgrade.upgradeStack), + }, + "sources": { + "machine_stack": { + "get_version": upgrade.getCfgVersion, + "location": {"./machine_instances"} + }, + "extruder_train": { + "get_version": upgrade.getCfgVersion, + "location": {"./extruders"} + }, + } + } + +def register(app): + return { "version_upgrade": upgrade } diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json b/plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json new file mode 100644 index 0000000000..3c3d7fff8c --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json @@ -0,0 +1,8 @@ + { + "name": "Version Upgrade 2.6 to 2.7", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Upgrades configurations from Cura 2.6 to Cura 2.7.", + "api": 4, + "i18n-catalog": "cura" +} diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py new file mode 100644 index 0000000000..f8e3561b38 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py @@ -0,0 +1,191 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import configparser #To check whether the appropriate exceptions are raised. +import pytest #To register tests with. + +import VersionUpgrade26to27 #The module we're testing. + +## Creates an instance of the upgrader to test with. +@pytest.fixture +def upgrader(): + return VersionUpgrade26to27.VersionUpgrade26to27() + +test_cfg_version_good_data = [ + { + "test_name": "Simple", + "file_data": """[general] +version = 1 +""", + "version": 1000000 + }, + { + "test_name": "Other Data Around", + "file_data": """[nonsense] +life = good + +[general] +version = 3 + +[values] +layer_height = 0.12 +infill_sparse_density = 42 +""", + "version": 3000000 + }, + { + "test_name": "Negative Version", #Why not? + "file_data": """[general] +version = -20 +""", + "version": -20000000 + }, + { + "test_name": "Setting Version", + "file_data": """[general] +version = 1 +[metadata] +setting_version = 1 +""", + "version": 1000001 + }, + { + "test_name": "Negative Setting Version", + "file_data": """[general] +version = 1 +[metadata] +setting_version = -3 +""", + "version": 999997 + } +] + +## Tests the technique that gets the version number from CFG files. +# +# \param data The parametrised data to test with. It contains a test name +# to debug with, the serialised contents of a CFG file and the correct +# version number in that CFG file. +# \param upgrader The instance of the upgrade class to test. +@pytest.mark.parametrize("data", test_cfg_version_good_data) +def test_cfgVersionGood(data, upgrader): + version = upgrader.getCfgVersion(data["file_data"]) + assert version == data["version"] + +test_cfg_version_bad_data = [ + { + "test_name": "Empty", + "file_data": "", + "exception": configparser.Error #Explicitly not specified further which specific error we're getting, because that depends on the implementation of configparser. + }, + { + "test_name": "No General", + "file_data": """[values] +layer_height = 0.1337 +""", + "exception": configparser.Error + }, + { + "test_name": "No Version", + "file_data": """[general] +true = false +""", + "exception": configparser.Error + }, + { + "test_name": "Not a Number", + "file_data": """[general] +version = not-a-text-version-number +""", + "exception": ValueError + }, + { + "test_name": "Setting Value NaN", + "file_data": """[general] +version = 4 +[metadata] +setting_version = latest_or_something +""", + "exception": ValueError + }, + { + "test_name": "Major-Minor", + "file_data": """[general] +version = 1.2 +""", + "exception": ValueError + } +] + +## Tests whether getting a version number from bad CFG files gives an +# exception. +# +# \param data The parametrised data to test with. It contains a test name +# to debug with, the serialised contents of a CFG file and the class of +# exception it needs to throw. +# \param upgrader The instance of the upgrader to test. +@pytest.mark.parametrize("data", test_cfg_version_bad_data) +def test_cfgVersionBad(data, upgrader): + with pytest.raises(data["exception"]): + upgrader.getCfgVersion(data["file_data"]) + +test_upgrade_stacks_with_not_supported_data = [ + { + "test_name": "Global stack with Not Supported quality profile", + "file_data": """[general] +version = 3 +name = Ultimaker 3 +id = Ultimaker 3 + +[metadata] +type = machine + +[containers] +0 = Ultimaker 3_user +1 = empty +2 = um3_global_Normal_Quality +3 = empty +4 = empty +5 = empty +6 = ultimaker3 +""" + }, + { + "test_name": "Extruder stack left with Not Supported quality profile", + "file_data": """[general] +version = 3 +name = Extruder 1 +id = ultimaker3_extruder_left #2 + +[metadata] +position = 0 +machine = Ultimaker 3 +type = extruder_train + +[containers] +0 = ultimaker3_extruder_left #2_user +1 = empty +2 = um3_aa0.4_PVA_Not_Supported_Quality +3 = generic_pva_ultimaker3_AA_0.4 +4 = ultimaker3_aa04 +5 = ultimaker3_extruder_left #2_settings +6 = ultimaker3_extruder_left +""" + } +] + +## Tests whether the "Not Supported" quality profiles in the global and extruder stacks are renamed for the 2.7 +# version of preferences. +@pytest.mark.parametrize("data", test_upgrade_stacks_with_not_supported_data) +def test_upgradeStacksWithNotSupportedQuality(data, upgrader): + # Read old file + original_parser = configparser.ConfigParser(interpolation = None) + original_parser.read_string(data["file_data"]) + + # Perform the upgrade. + _, upgraded_stacks = upgrader.upgradeStack(data["file_data"], "") + upgraded_stack = upgraded_stacks[0] + + # Find whether the not supported profile has been renamed + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(upgraded_stack) + assert("Not_Supported" not in parser.get("containers", "2")) From 3d48024a47479875fe2773d7466ee8e77961af1d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 10:22:36 +0200 Subject: [PATCH 211/379] Override getConfigurationTypeFromSerialized for GlobalStack CURA-3975 GlobalStack has metadata type "machine", which is different from what is registered in the VersionUpgradeManager "machine_stack". This commit makes sure that Cura can find the correct upgrade route for the GlobalStack files. --- cura/Settings/GlobalStack.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 4e7bcdf486..e49b1a25de 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -1,7 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from typing import Any, Dict +from typing import Any, Dict, Optional from PyQt5.QtCore import pyqtProperty @@ -42,6 +42,17 @@ class GlobalStack(CuraContainerStack): def getLoadingPriority(cls) -> int: return 2 + def getConfigurationTypeFromSerialized(self, serialized: str) -> Optional[str]: + configuration_type = None + try: + parser = self._readAndValidateSerialized(serialized) + configuration_type = parser["metadata"].get("type") + if configuration_type == "machine": + configuration_type = "machine_stack" + except Exception as e: + Logger.log("e", "Could not get configuration type: %s", e) + return configuration_type + ## Add an extruder to the list of extruders of this stack. # # \param extruder The extruder to add. From c196a4bf00b53cd59232b71c92179f9a5e101f9d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 10:42:24 +0200 Subject: [PATCH 212/379] Fix stack file version number in VersionUpgrade26to27 CURA-3975 --- .../VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py index c0e085bcfb..38031765d5 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py @@ -112,7 +112,7 @@ class VersionUpgrade26to27(VersionUpgrade): parser["metadata"]["setting_version"] = str(CuraApplication.SettingVersion) # Update version - parser["general"]["version"] = "4" + parser["general"]["version"] = "3" # Re-serialise the file. output = io.StringIO() From 95cacb83001e9ff6f0522135bc1c83191af6e079 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 6 Jul 2017 10:46:29 +0200 Subject: [PATCH 213/379] Added missing translate to topbar --- resources/qml/Topbar.qml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 1d51c8eccc..1b5792124e 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -23,6 +23,11 @@ Rectangle property bool monitoringPrint: false signal startMonitoringPrint() signal stopMonitoringPrint() + UM.I18nCatalog + { + id: catalog + name:"cura" + } Row { @@ -39,7 +44,7 @@ Rectangle iconSource: UM.Theme.getIcon("tab_settings"); property color overlayColor: "transparent" property string overlayIconSource: "" - text: "Prepare" + text: catalog.i18nc("@title:tab","Prepare") checkable: true checked: !base.monitoringPrint exclusiveGroup: sidebarHeaderBarGroup @@ -52,7 +57,7 @@ Rectangle id: showMonitor height: UM.Theme.getSize("sidebar_header").height onClicked: base.startMonitoringPrint() - text: "Print" + text: catalog.i18nc("@title:tab", "Print") iconSource: printerConnected ? UM.Theme.getIcon("tab_monitor_with_status") : UM.Theme.getIcon("tab_monitor") property color overlayColor: { From ead94a84566153184c85521c9bfb842ab59fbd15 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 11:26:34 +0200 Subject: [PATCH 214/379] Cura should register actual stack MIME types instead of the generic Uranium stack type CURA-3975 When the ContainerRegister loads all container files, it decides which actual class to use based on the registered MIME type of that file. Because Cura registers the GlobalStack and ExtruderStack files as the generic Uranium MIME type, the register loads them as Uranium ContainerStacks. This commit solves this problem. --- cura/CuraApplication.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 99fb4f8a05..6321dbf670 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -179,8 +179,8 @@ class CuraApplication(QtApplication): UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions( { ("quality_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), - ("machine_stack", ContainerStack.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), - ("extruder_train", ContainerStack.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.ExtruderStack, "application/x-uranium-extruderstack"), + ("machine_stack", ContainerStack.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.MachineStack, "application/x-cura-globalstack"), + ("extruder_train", ContainerStack.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.ExtruderStack, "application/x-cura-extruderstack"), ("preferences", Preferences.Version * 1000000 + self.SettingVersion): (Resources.Preferences, "application/x-uranium-preferences"), ("user", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer"), ("definition_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.DefinitionChangesContainer, "application/x-uranium-instancecontainer"), From 4e3ff1b770c99a5cda74b8e4974d31afe65da82d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 12:06:02 +0200 Subject: [PATCH 215/379] Fix version upgrade for 2.5 to 2.6 CURA-3975 - Preferences version is not set correctly - The upgrade script should use a standalone version string because the CuraApplication.SettingVersion can change --- .../VersionUpgrade25to26/VersionUpgrade25to26.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py index 85f54dd654..699dd4d1bb 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py @@ -62,8 +62,8 @@ class VersionUpgrade25to26(VersionUpgrade): parser["general"]["visible_settings"] = ";".join(new_visible_settings) #Change the version number in the file. - if parser.has_section("general"): #It better have! - parser["general"]["version"] = "5" + parser.set("general", "version", "4") + parser.set("general", "setting_version", "1") #Re-serialise the file. output = io.StringIO() @@ -91,11 +91,9 @@ class VersionUpgrade25to26(VersionUpgrade): if not parser.has_section(each_section): parser.add_section(each_section) - # Change the version number in the file. - parser["metadata"]["setting_version"] = str(CuraApplication.SettingVersion) - - # Update version + # Update version numbers parser["general"]["version"] = "2" + parser["metadata"]["setting_version"] = "1" #Re-serialise the file. output = io.StringIO() From 4727e4aa9598977bbfc491e92bad8791e57258d3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 12:13:29 +0200 Subject: [PATCH 216/379] Remove unused imports CURA-3975 --- .../VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py index 699dd4d1bb..d3e22ba5d2 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py @@ -5,7 +5,6 @@ import configparser #To parse the files we need to upgrade and write the new fil import io #To serialise configparser output to a string. from UM.VersionUpgrade import VersionUpgrade -from cura.CuraApplication import CuraApplication _removed_settings = { #Settings that were removed in 2.5. "start_layers_at_same_position", From eb88ad5a3d29b602cbc5ad01c2230f6df0111c80 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 13:38:18 +0200 Subject: [PATCH 217/379] Change mode to 0644 for all quality files CURA-3975 --- .../quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg | 0 .../quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg old mode 100755 new mode 100644 From bd75102ee530e93d7c852efdcc1aa3611a4921cf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 6 Jul 2017 13:50:53 +0200 Subject: [PATCH 218/379] Fix saving g-code if no quality profile is set If the quality profile was 'empty', then the container type wasn't properly set, so you can't find any quality profile. This gets the quality profile from the stacks, so you will find the empty profile (which has the wrong type but at least you can try to request metadata from it). --- plugins/GCodeWriter/GCodeWriter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 47ccc21bcd..61bd682de0 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from UM.Mesh.MeshWriter import MeshWriter @@ -113,7 +113,7 @@ class GCodeWriter(MeshWriter): # Ensure that quality_type is set. (Can happen if we have empty quality changes). if flat_global_container.getMetaDataEntry("quality_type", None) is None: - flat_global_container.addMetaDataEntry("quality_type", stack.findContainer({"type": "quality"}).getMetaDataEntry("quality_type", "normal")) + flat_global_container.addMetaDataEntry("quality_type", stack.quality.getMetaDataEntry("quality_type", "normal")) serialized = flat_global_container.serialize() data = {"global_quality": serialized} @@ -134,7 +134,7 @@ class GCodeWriter(MeshWriter): # Ensure that quality_type is set. (Can happen if we have empty quality changes). if flat_extruder_quality.getMetaDataEntry("quality_type", None) is None: - flat_extruder_quality.addMetaDataEntry("quality_type", extruder.findContainer({"type": "quality"}).getMetaDataEntry("quality_type", "normal")) + flat_extruder_quality.addMetaDataEntry("quality_type", extruder.quality.getMetaDataEntry("quality_type", "normal")) extruder_serialized = flat_extruder_quality.serialize() data.setdefault("extruder_quality", []).append(extruder_serialized) From 72afefbfd48cd12fad11959b6dffd61c1ac2b0c1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 13:17:57 +0200 Subject: [PATCH 219/379] Update setting_version to 2 for variants CURA-3975 --- resources/variants/cartesio_0.25.inst.cfg | 2 +- resources/variants/cartesio_0.4.inst.cfg | 2 +- resources/variants/cartesio_0.8.inst.cfg | 2 +- resources/variants/imade3d_jellybox_0.4.inst.cfg | 2 +- resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg | 2 +- resources/variants/ultimaker2_0.25.inst.cfg | 2 +- resources/variants/ultimaker2_0.4.inst.cfg | 2 +- resources/variants/ultimaker2_0.6.inst.cfg | 2 +- resources/variants/ultimaker2_0.8.inst.cfg | 2 +- resources/variants/ultimaker2_extended_0.25.inst.cfg | 2 +- resources/variants/ultimaker2_extended_0.4.inst.cfg | 2 +- resources/variants/ultimaker2_extended_0.6.inst.cfg | 2 +- resources/variants/ultimaker2_extended_0.8.inst.cfg | 2 +- resources/variants/ultimaker2_extended_plus_0.25.inst.cfg | 2 +- resources/variants/ultimaker2_extended_plus_0.4.inst.cfg | 2 +- resources/variants/ultimaker2_extended_plus_0.6.inst.cfg | 2 +- resources/variants/ultimaker2_extended_plus_0.8.inst.cfg | 2 +- resources/variants/ultimaker2_plus_0.25.inst.cfg | 2 +- resources/variants/ultimaker2_plus_0.4.inst.cfg | 2 +- resources/variants/ultimaker2_plus_0.6.inst.cfg | 2 +- resources/variants/ultimaker2_plus_0.8.inst.cfg | 2 +- resources/variants/ultimaker3_aa0.8.inst.cfg | 2 +- resources/variants/ultimaker3_aa04.inst.cfg | 2 +- resources/variants/ultimaker3_bb0.8.inst.cfg | 2 +- resources/variants/ultimaker3_bb04.inst.cfg | 2 +- resources/variants/ultimaker3_extended_aa0.8.inst.cfg | 2 +- resources/variants/ultimaker3_extended_aa04.inst.cfg | 2 +- resources/variants/ultimaker3_extended_bb0.8.inst.cfg | 2 +- resources/variants/ultimaker3_extended_bb04.inst.cfg | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/resources/variants/cartesio_0.25.inst.cfg b/resources/variants/cartesio_0.25.inst.cfg index b789eef732..23179b5c7e 100644 --- a/resources/variants/cartesio_0.25.inst.cfg +++ b/resources/variants/cartesio_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = cartesio [metadata] author = Cartesio type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/cartesio_0.4.inst.cfg b/resources/variants/cartesio_0.4.inst.cfg index 46140ccc24..ad8d98519e 100644 --- a/resources/variants/cartesio_0.4.inst.cfg +++ b/resources/variants/cartesio_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = cartesio [metadata] author = Cartesio type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/cartesio_0.8.inst.cfg b/resources/variants/cartesio_0.8.inst.cfg index 118d79144a..c5bc386558 100644 --- a/resources/variants/cartesio_0.8.inst.cfg +++ b/resources/variants/cartesio_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = cartesio [metadata] author = Cartesio type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/imade3d_jellybox_0.4.inst.cfg b/resources/variants/imade3d_jellybox_0.4.inst.cfg index 8bce86482b..b590dec264 100644 --- a/resources/variants/imade3d_jellybox_0.4.inst.cfg +++ b/resources/variants/imade3d_jellybox_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = imade3d_jellybox [metadata] author = IMADE3D type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg b/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg index e02c1fe29f..419506c908 100644 --- a/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg +++ b/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg @@ -6,7 +6,7 @@ definition = imade3d_jellybox [metadata] author = IMADE3D type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_0.25.inst.cfg b/resources/variants/ultimaker2_0.25.inst.cfg index 1891124ce9..d2d4abc7d4 100644 --- a/resources/variants/ultimaker2_0.25.inst.cfg +++ b/resources/variants/ultimaker2_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_0.4.inst.cfg b/resources/variants/ultimaker2_0.4.inst.cfg index 622c97e6ff..325eb04040 100644 --- a/resources/variants/ultimaker2_0.4.inst.cfg +++ b/resources/variants/ultimaker2_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_0.6.inst.cfg b/resources/variants/ultimaker2_0.6.inst.cfg index e64880932f..6fb8005ed0 100644 --- a/resources/variants/ultimaker2_0.6.inst.cfg +++ b/resources/variants/ultimaker2_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_0.8.inst.cfg b/resources/variants/ultimaker2_0.8.inst.cfg index f4b86e58ed..7c256b9416 100644 --- a/resources/variants/ultimaker2_0.8.inst.cfg +++ b/resources/variants/ultimaker2_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker2_extended_0.25.inst.cfg b/resources/variants/ultimaker2_extended_0.25.inst.cfg index 1a53ebc362..4e248c55c4 100644 --- a/resources/variants/ultimaker2_extended_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_extended_0.4.inst.cfg b/resources/variants/ultimaker2_extended_0.4.inst.cfg index e7caaa0772..01adecceeb 100644 --- a/resources/variants/ultimaker2_extended_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_extended_0.6.inst.cfg b/resources/variants/ultimaker2_extended_0.6.inst.cfg index 888dce45e8..a93ce8f628 100644 --- a/resources/variants/ultimaker2_extended_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_extended_0.8.inst.cfg b/resources/variants/ultimaker2_extended_0.8.inst.cfg index 3f2e9dc55f..9588d017ec 100644 --- a/resources/variants/ultimaker2_extended_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg index 044bec5731..fa5861ea6d 100644 --- a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg index 70cfbb81d1..ef0bed8305 100644 --- a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg index 0bd4d181ac..643b0d3d8c 100644 --- a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg index d83f23859f..a282b288a2 100644 --- a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker2_plus_0.25.inst.cfg b/resources/variants/ultimaker2_plus_0.25.inst.cfg index f493fecb71..14d8d5d899 100644 --- a/resources/variants/ultimaker2_plus_0.25.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_plus_0.4.inst.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg index b7a7d8c7a7..ccc1d246a0 100644 --- a/resources/variants/ultimaker2_plus_0.4.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_plus_0.6.inst.cfg b/resources/variants/ultimaker2_plus_0.6.inst.cfg index 9954359cc5..40c1f523a8 100644 --- a/resources/variants/ultimaker2_plus_0.6.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_plus_0.8.inst.cfg b/resources/variants/ultimaker2_plus_0.8.inst.cfg index de21ac87ab..563b955063 100644 --- a/resources/variants/ultimaker2_plus_0.8.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker3_aa0.8.inst.cfg b/resources/variants/ultimaker3_aa0.8.inst.cfg index 41d6191883..9d31e166ed 100644 --- a/resources/variants/ultimaker3_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_aa0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_aa04.inst.cfg b/resources/variants/ultimaker3_aa04.inst.cfg index ff380197ea..dfdd57a075 100644 --- a/resources/variants/ultimaker3_aa04.inst.cfg +++ b/resources/variants/ultimaker3_aa04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index c9a8c5a945..d90190885f 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index 5a4b39f68a..1e9218d262 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) diff --git a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg index c2ecbcdf49..8f97e448b0 100644 --- a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_extended_aa04.inst.cfg b/resources/variants/ultimaker3_extended_aa04.inst.cfg index f66be12d49..f35210383e 100644 --- a/resources/variants/ultimaker3_extended_aa04.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg index 8a4dcfee09..0374068186 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index e35ab82d9f..cc8fb187e8 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 1 +setting_version = 2 [values] acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) From 3983da30aa356242374843cfe96cbb8f1beb6ec8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 13:18:55 +0200 Subject: [PATCH 220/379] Update setting_version to 2 for qualities CURA-3975 --- .../quality/abax_pri3/apri3_pla_fast.inst.cfg | 42 +++--- .../quality/abax_pri3/apri3_pla_high.inst.cfg | 42 +++--- .../abax_pri3/apri3_pla_normal.inst.cfg | 42 +++--- .../quality/abax_pri5/apri5_pla_fast.inst.cfg | 42 +++--- .../quality/abax_pri5/apri5_pla_high.inst.cfg | 42 +++--- .../abax_pri5/apri5_pla_normal.inst.cfg | 42 +++--- .../abax_titan/atitan_pla_fast.inst.cfg | 42 +++--- .../abax_titan/atitan_pla_high.inst.cfg | 40 +++--- .../abax_titan/atitan_pla_normal.inst.cfg | 42 +++--- .../abs/cartesio_0.25_abs_high.inst.cfg | 2 +- .../abs/cartesio_0.25_abs_normal.inst.cfg | 2 +- .../abs/cartesio_0.4_abs_high.inst.cfg | 2 +- .../abs/cartesio_0.4_abs_normal.inst.cfg | 2 +- .../abs/cartesio_0.8_abs_coarse.inst.cfg | 2 +- .../cartesio_0.8_abs_extra_coarse.inst.cfg | 2 +- .../abs/cartesio_0.8_abs_high.inst.cfg | 2 +- .../abs/cartesio_0.8_abs_normal.inst.cfg | 2 +- .../cartesio_0.4_arnitel2045_high.inst.cfg | 2 +- .../cartesio_0.4_arnitel2045_normal.inst.cfg | 2 +- .../cartesio_global_Coarse_Quality.inst.cfg | 2 +- ...tesio_global_Extra_Coarse_Quality.inst.cfg | 2 +- .../cartesio_global_High_Quality.inst.cfg | 2 +- .../cartesio_global_Normal_Quality.inst.cfg | 2 +- .../hips/cartesio_0.25_hips_high.inst.cfg | 2 +- .../hips/cartesio_0.25_hips_normal.inst.cfg | 2 +- .../hips/cartesio_0.4_hips_high.inst.cfg | 2 +- .../hips/cartesio_0.4_hips_normal.inst.cfg | 2 +- .../hips/cartesio_0.8_hips_coarse.inst.cfg | 2 +- .../cartesio_0.8_hips_extra_coarse.inst.cfg | 2 +- .../hips/cartesio_0.8_hips_high.inst.cfg | 2 +- .../hips/cartesio_0.8_hips_normal.inst.cfg | 2 +- .../nylon/cartesio_0.25_nylon_high.inst.cfg | 2 +- .../nylon/cartesio_0.25_nylon_normal.inst.cfg | 2 +- .../nylon/cartesio_0.4_nylon_high.inst.cfg | 2 +- .../nylon/cartesio_0.4_nylon_normal.inst.cfg | 2 +- .../nylon/cartesio_0.8_nylon_coarse.inst.cfg | 2 +- .../cartesio_0.8_nylon_extra_coarse.inst.cfg | 2 +- .../nylon/cartesio_0.8_nylon_high.inst.cfg | 2 +- .../nylon/cartesio_0.8_nylon_normal.inst.cfg | 2 +- .../pc/cartesio_0.25_pc_high.inst.cfg | 2 +- .../pc/cartesio_0.25_pc_normal.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.4_pc_high.inst.cfg | 2 +- .../pc/cartesio_0.4_pc_normal.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_coarse.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_extra_coarse.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.8_pc_high.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_normal.inst.cfg | 2 +- .../petg/cartesio_0.25_petg_high.inst.cfg | 2 +- .../petg/cartesio_0.25_petg_normal.inst.cfg | 2 +- .../petg/cartesio_0.4_petg_high.inst.cfg | 2 +- .../petg/cartesio_0.4_petg_normal.inst.cfg | 2 +- .../petg/cartesio_0.8_petg_coarse.inst.cfg | 2 +- .../cartesio_0.8_petg_extra_coarse.inst.cfg | 2 +- .../petg/cartesio_0.8_petg_high.inst.cfg | 2 +- .../petg/cartesio_0.8_petg_normal.inst.cfg | 2 +- .../pla/cartesio_0.25_pla_high.inst.cfg | 2 +- .../pla/cartesio_0.25_pla_normal.inst.cfg | 2 +- .../pla/cartesio_0.4_pla_high.inst.cfg | 2 +- .../pla/cartesio_0.4_pla_normal.inst.cfg | 2 +- .../pla/cartesio_0.8_pla_coarse.inst.cfg | 2 +- .../cartesio_0.8_pla_extra_coarse.inst.cfg | 2 +- .../pla/cartesio_0.8_pla_high.inst.cfg | 2 +- .../pla/cartesio_0.8_pla_normal.inst.cfg | 2 +- .../pva/cartesio_0.25_pva_high.inst.cfg | 2 +- .../pva/cartesio_0.25_pva_normal.inst.cfg | 2 +- .../pva/cartesio_0.4_pva_high.inst.cfg | 2 +- .../pva/cartesio_0.4_pva_normal.inst.cfg | 2 +- .../pva/cartesio_0.8_pva_coarse.inst.cfg | 2 +- .../cartesio_0.8_pva_extra_coarse.inst.cfg | 2 +- .../pva/cartesio_0.8_pva_high.inst.cfg | 2 +- .../pva/cartesio_0.8_pva_normal.inst.cfg | 2 +- resources/quality/coarse.inst.cfg | 2 +- resources/quality/draft.inst.cfg | 2 +- resources/quality/extra_coarse.inst.cfg | 2 +- resources/quality/high.inst.cfg | 2 +- .../generic_petg_0.4_coarse.inst.cfg | 2 +- .../generic_petg_0.4_coarse_2-fans.inst.cfg | 2 +- .../generic_petg_0.4_medium.inst.cfg | 2 +- .../generic_petg_0.4_medium_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_coarse.inst.cfg | 2 +- .../generic_pla_0.4_coarse_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_fine.inst.cfg | 2 +- .../generic_pla_0.4_fine_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_medium.inst.cfg | 2 +- .../generic_pla_0.4_medium_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_ultrafine.inst.cfg | 2 +- .../generic_pla_0.4_ultrafine_2-fans.inst.cfg | 2 +- resources/quality/low.inst.cfg | 2 +- resources/quality/normal.inst.cfg | 2 +- .../peopoly_moai/peopoly_moai_high.inst.cfg | 2 +- .../peopoly_moai/peopoly_moai_max.inst.cfg | 2 +- .../peopoly_moai/peopoly_moai_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.25_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.4_fast.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.4_high.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.4_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.6_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.8_normal.inst.cfg | 2 +- .../um2p_abs_0.25_normal.inst.cfg | 2 +- .../um2p_abs_0.4_fast.inst.cfg | 2 +- .../um2p_abs_0.4_high.inst.cfg | 2 +- .../um2p_abs_0.4_normal.inst.cfg | 2 +- .../um2p_abs_0.6_normal.inst.cfg | 2 +- .../um2p_abs_0.8_normal.inst.cfg | 2 +- .../um2p_cpe_0.25_normal.inst.cfg | 2 +- .../um2p_cpe_0.4_fast.inst.cfg | 2 +- .../um2p_cpe_0.4_high.inst.cfg | 2 +- .../um2p_cpe_0.4_normal.inst.cfg | 2 +- .../um2p_cpe_0.6_normal.inst.cfg | 2 +- .../um2p_cpe_0.8_normal.inst.cfg | 2 +- .../um2p_cpep_0.4_draft.inst.cfg | 2 +- .../um2p_cpep_0.4_normal.inst.cfg | 2 +- .../um2p_cpep_0.6_draft.inst.cfg | 2 +- .../um2p_cpep_0.6_normal.inst.cfg | 2 +- .../um2p_cpep_0.8_draft.inst.cfg | 2 +- .../um2p_cpep_0.8_normal.inst.cfg | 2 +- .../um2p_nylon_0.25_high.inst.cfg | 2 +- .../um2p_nylon_0.25_normal.inst.cfg | 2 +- .../um2p_nylon_0.4_fast.inst.cfg | 2 +- .../um2p_nylon_0.4_normal.inst.cfg | 2 +- .../um2p_nylon_0.6_fast.inst.cfg | 2 +- .../um2p_nylon_0.6_normal.inst.cfg | 2 +- .../um2p_nylon_0.8_draft.inst.cfg | 2 +- .../um2p_nylon_0.8_normal.inst.cfg | 2 +- .../um2p_pc_0.25_high.inst.cfg | 2 +- .../um2p_pc_0.25_normal.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg | 2 +- .../um2p_pc_0.4_normal.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg | 2 +- .../um2p_pc_0.6_normal.inst.cfg | 2 +- .../um2p_pc_0.8_draft.inst.cfg | 2 +- .../um2p_pc_0.8_normal.inst.cfg | 2 +- .../um2p_pp_0.25_normal.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 2 +- .../um2p_pp_0.4_normal.inst.cfg | 2 +- .../um2p_pp_0.6_draft.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 2 +- .../um2p_pp_0.8_draft.inst.cfg | 2 +- .../um2p_pp_0.8_verydraft.inst.cfg | 2 +- .../um2p_tpu_0.25_high.inst.cfg | 2 +- .../um2p_tpu_0.4_normal.inst.cfg | 2 +- .../um2p_tpu_0.6_fast.inst.cfg | 2 +- .../um3_aa0.4_ABS_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_ABS_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_ABS_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_ABS_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPEP_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_CPEP_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_CPEP_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPEP_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPE_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_CPE_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_CPE_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPE_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_Nylon_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_Nylon_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_Nylon_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_Nylon_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PC_Draft_Print.inst.cfg | 130 +++++++++--------- .../um3_aa0.4_PC_Fast_Print.inst.cfg | 128 ++++++++--------- .../um3_aa0.4_PC_High_Quality.inst.cfg | 130 +++++++++--------- .../um3_aa0.4_PC_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PLA_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_PLA_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_PLA_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_PLA_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PP_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_PP_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_PP_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PVA_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_TPU_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_TPU_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_TPU_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.8_ABS_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_ABS_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_ABS_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPEP_Fast_Print.inst.cfg | 2 +- .../um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPE_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPE_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPE_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_Nylon_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_Nylon_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_Nylon_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PC_Fast_Print.inst.cfg | 2 +- .../um3_aa0.8_PC_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PC_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PLA_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_PLA_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PLA_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PP_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_PP_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PP_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PVA_Fast_Print.inst.cfg | 2 +- .../um3_aa0.8_PVA_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_TPU_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 2 +- .../um3_bb0.4_ABS_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_ABS_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.4_CPEP_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_CPEP_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.4_CPE_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_CPE_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.4_Nylon_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_Nylon_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.4_PC_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_PLA_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_PLA_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.4_PVA_Draft_Print.inst.cfg | 2 +- .../um3_bb0.4_PVA_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_PVA_High_Quality.inst.cfg | 2 +- .../um3_bb0.4_PVA_Normal_Quality.inst.cfg | 2 +- .../um3_bb0.4_TPU_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_TPU_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_ABS_Fast_Print.inst.cfg | 2 +- .../um3_bb0.8_ABS_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_CPEP_Fast_Print.inst.cfg | 2 +- .../um3_bb0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_CPE_Fast_Print.inst.cfg | 2 +- .../um3_bb0.8_CPE_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_Nylon_Fast_Print.inst.cfg | 2 +- .../um3_bb0.8_Nylon_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_PC_Fast_Print.inst.cfg | 2 +- .../um3_bb0.8_PC_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_PLA_Fast_Print.inst.cfg | 2 +- .../um3_bb0.8_PLA_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_PVA_Draft_Print.inst.cfg | 2 +- .../um3_bb0.8_PVA_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_PVA_Verydraft_Print.inst.cfg | 2 +- .../um3_bb0.8_TPU_Fast_print.inst.cfg | 2 +- .../um3_bb0.8_TPU_Superdraft_Print.inst.cfg | 2 +- .../um3_global_Draft_Quality.inst.cfg | 2 +- .../um3_global_Fast_Quality.inst.cfg | 2 +- .../um3_global_High_Quality.inst.cfg | 2 +- .../um3_global_Normal_Quality.inst.cfg | 2 +- .../um3_global_Superdraft_Quality.inst.cfg | 2 +- .../um3_global_Verydraft_Quality.inst.cfg | 2 +- 239 files changed, 609 insertions(+), 609 deletions(-) diff --git a/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg b/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg index aa73d04f4a..b002ef1e4d 100644 --- a/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg +++ b/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Fine -definition = abax_pri3 - -[metadata] -type = quality -material = generic_pla -weight = 0 -quality_type = normal -setting_version = 1 - -[values] -layer_height = 0.2 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 80 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Fine +definition = abax_pri3 + +[metadata] +type = quality +material = generic_pla +weight = 0 +quality_type = normal +setting_version = 2 + +[values] +layer_height = 0.2 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 80 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_pri3/apri3_pla_high.inst.cfg b/resources/quality/abax_pri3/apri3_pla_high.inst.cfg index 9b2af23ffc..38036404d9 100644 --- a/resources/quality/abax_pri3/apri3_pla_high.inst.cfg +++ b/resources/quality/abax_pri3/apri3_pla_high.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Extra Fine -definition = abax_pri3 - -[metadata] -type = quality -material = generic_pla -weight = 1 -quality_type = high -setting_version = 1 - -[values] -layer_height = 0.1 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 50 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Extra Fine +definition = abax_pri3 + +[metadata] +type = quality +material = generic_pla +weight = 1 +quality_type = high +setting_version = 2 + +[values] +layer_height = 0.1 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg b/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg index 0b566a7ae0..02d564e8cb 100644 --- a/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg +++ b/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Fine -definition = abax_pri3 - -[metadata] -type = quality -material = generic_pla -weight = 0 -quality_type = normal -setting_version = 1 - -[values] -layer_height = 0.2 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 50 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Fine +definition = abax_pri3 + +[metadata] +type = quality +material = generic_pla +weight = 0 +quality_type = normal +setting_version = 2 + +[values] +layer_height = 0.2 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg b/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg index 7729ae3772..23baec151b 100644 --- a/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg +++ b/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Fine -definition = abax_pri5 - -[metadata] -type = quality -material = generic_pla -weight = 0 -quality_type = normal -setting_version = 1 - -[values] -layer_height = 0.2 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 80 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Fine +definition = abax_pri5 + +[metadata] +type = quality +material = generic_pla +weight = 0 +quality_type = normal +setting_version = 2 + +[values] +layer_height = 0.2 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 80 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_pri5/apri5_pla_high.inst.cfg b/resources/quality/abax_pri5/apri5_pla_high.inst.cfg index 04f4e82604..d7996f9578 100644 --- a/resources/quality/abax_pri5/apri5_pla_high.inst.cfg +++ b/resources/quality/abax_pri5/apri5_pla_high.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Extra Fine -definition = abax_pri5 - -[metadata] -type = quality -material = generic_pla -weight = 1 -quality_type = high -setting_version = 1 - -[values] -layer_height = 0.1 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 50 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Extra Fine +definition = abax_pri5 + +[metadata] +type = quality +material = generic_pla +weight = 1 +quality_type = high +setting_version = 2 + +[values] +layer_height = 0.1 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg b/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg index 3f3dd7a1e3..a0cc6dc00c 100644 --- a/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg +++ b/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Fine -definition = abax_pri5 - -[metadata] -type = quality -material = generic_pla -weight = 0 -quality_type = normal -setting_version = 1 - -[values] -layer_height = 0.2 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 50 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Fine +definition = abax_pri5 + +[metadata] +type = quality +material = generic_pla +weight = 0 +quality_type = normal +setting_version = 2 + +[values] +layer_height = 0.2 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_titan/atitan_pla_fast.inst.cfg b/resources/quality/abax_titan/atitan_pla_fast.inst.cfg index 5fae85c117..2208ad2fb5 100644 --- a/resources/quality/abax_titan/atitan_pla_fast.inst.cfg +++ b/resources/quality/abax_titan/atitan_pla_fast.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Fine -definition = abax_titan - -[metadata] -type = quality -material = generic_pla -weight = 0 -quality_type = normal -setting_version = 1 - -[values] -layer_height = 0.2 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 80 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Fine +definition = abax_titan + +[metadata] +type = quality +material = generic_pla +weight = 0 +quality_type = normal +setting_version = 2 + +[values] +layer_height = 0.2 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 80 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_titan/atitan_pla_high.inst.cfg b/resources/quality/abax_titan/atitan_pla_high.inst.cfg index 71c42fbdb7..91a3bffea6 100644 --- a/resources/quality/abax_titan/atitan_pla_high.inst.cfg +++ b/resources/quality/abax_titan/atitan_pla_high.inst.cfg @@ -1,21 +1,21 @@ -[general] -version = 2 -name = Extra Fine -definition = abax_titan -[metadata] -type = quality -material = generic_pla -weight = 1 -quality_type = high -setting_version = 1 - -[values] -layer_height = 0.1 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 50 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Extra Fine +definition = abax_titan +[metadata] +type = quality +material = generic_pla +weight = 1 +quality_type = high +setting_version = 2 + +[values] +layer_height = 0.1 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/abax_titan/atitan_pla_normal.inst.cfg b/resources/quality/abax_titan/atitan_pla_normal.inst.cfg index 2ae819ed50..4ff47e9c65 100644 --- a/resources/quality/abax_titan/atitan_pla_normal.inst.cfg +++ b/resources/quality/abax_titan/atitan_pla_normal.inst.cfg @@ -1,22 +1,22 @@ -[general] -version = 2 -name = Fine -definition = abax_titan - -[metadata] -type = quality -material = generic_pla -weight = 0 -quality_type = normal -setting_version = 1 - -[values] -layer_height = 0.2 -wall_thickness = 1.05 -top_bottom_thickness = 0.8 -infill_sparse_density = 20 -speed_print = 50 -speed_layer_0 = =round(speed_print * 30 / 50) -speed_topbottom = 20 -cool_min_layer_time = 5 +[general] +version = 2 +name = Fine +definition = abax_titan + +[metadata] +type = quality +material = generic_pla +weight = 0 +quality_type = normal +setting_version = 2 + +[values] +layer_height = 0.2 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 cool_min_speed = 10 \ No newline at end of file diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg index 1c5a222dad..482cad643f 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg index 2a7be1ac2b..a86f734c8a 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg index 0a47ae7697..4e1ccb5070 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg index ccbb2224c7..1422663537 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg index 8d227fd862..edd337bb88 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_abs_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg index b8db42401d..78493a273b 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_abs_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg index 4025bc2cb2..ecd04d5c34 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg index 1f38a69781..393a419cdc 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg index cf7774445b..3a430b85e7 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = dsm_arnitel2045_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg index 4896cfe40a..f899082e9c 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = dsm_arnitel2045_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg index 572c56ee54..f44b33b1d1 100644 --- a/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.4 diff --git a/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg index fcbaa7be70..6b0a379eb2 100644 --- a/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.6 diff --git a/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg index 746711a4ff..944f8a1d97 100644 --- a/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.1 diff --git a/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg index 9796092dac..c0d1a301f3 100644 --- a/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.2 diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg index 184b097ee8..fa41da66e4 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_hips_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg index 3f5db2473a..af419719b1 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_hips_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg index ee21935f5b..6046eb961f 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_hips_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg index 3aace85864..e26fcaa037 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_hips_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg index 3c40ebd38a..d7d1d8aa4d 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_hips_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg index 6fe684dde6..68c282fd7d 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_hips_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg index 90020ffa3e..abbf605017 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_hips_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg index 257389662a..1388e9bee1 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_hips_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg index babe2ef7e9..363c48a6cc 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg index e0380da0f0..73c1d7010b 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg index 6a99be39f8..ff90fc1be0 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg index fcb2ec7b45..89114b1a79 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg index b54a087e2b..5a35735d11 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_nylon_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg index 845764a3de..4a20f2e0e7 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_nylon_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg index 8ac54aaca2..69dee77e5d 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg index 2635dc18a7..34c0d66899 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg index 47db068af9..6abdf096f9 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg index 256f3237ea..0361b789ba 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg index 345ecea394..1a72f6fd2d 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg index ff3d5f2de2..11723cc92b 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg index e57f5eaca2..070f73fa0e 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_pc_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg index 73d2084610..26662accf5 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_pc_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg index d942415e64..b3da7afb1b 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg index 2c1ddf6ec5..a30c4ea884 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg index 037456bc72..ed623e03bd 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_petg_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg index cbef9eb62a..11e55362ae 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_petg_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg index 4a4d8cf69f..01184e39ec 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_petg_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg index f2c69bdb88..d1fa4d40ca 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_petg_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg index 3fca8f0f72..f728848461 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_petg_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg index c2f86afbf3..851b893a96 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_petg_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg index 291cf071d7..d4cfc844bf 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_petg_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg index 1c8bd403c9..2e7d86c378 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_petg_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg index c7d0432443..ede3c0f1a3 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg index cf736a2d31..311d287cdc 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg index 816d0f0304..ff1e374da2 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg index cf78eafb6d..dfa47d2ebb 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg index fc8eec3fb5..a17454ba87 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_pla_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg index fccb15ee29..3f4db2d40a 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_pla_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg index da9515d387..94aedae655 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg index 8992fc1e41..1071a139f9 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg index ddd097875b..ca6e1ea2a5 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pva_175_cartesio_0.25_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg index c83c6ca004..e074b1f1b7 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pva_175_cartesio_0.25_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg index 0c6f6813ea..45c2eefd11 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pva_175_cartesio_0.4_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg index 6b68aacc53..1e69f794a8 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pva_175_cartesio_0.4_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg index 69e66a0171..2ac1aff331 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_pva_175_cartesio_0.8_mm weight = 3 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg index 1fb5c72cfc..14602d4e95 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_pva_175_cartesio_0.8_mm weight = 4 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg index cfdfdbc708..ad65765a83 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pva_175_cartesio_0.8_mm weight = 1 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg index f146874fb4..61eb2f89d9 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pva_175_cartesio_0.8_mm weight = 2 -setting_version = 1 +setting_version = 2 [values] infill_line_width = 0.9 diff --git a/resources/quality/coarse.inst.cfg b/resources/quality/coarse.inst.cfg index 7722e9d0ae..bdeda58626 100644 --- a/resources/quality/coarse.inst.cfg +++ b/resources/quality/coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse global_quality = True weight = -3 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.4 diff --git a/resources/quality/draft.inst.cfg b/resources/quality/draft.inst.cfg index 21a7c81d6c..15df2f2f08 100644 --- a/resources/quality/draft.inst.cfg +++ b/resources/quality/draft.inst.cfg @@ -9,7 +9,7 @@ type = quality quality_type = draft global_quality = True weight = -2 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.2 diff --git a/resources/quality/extra_coarse.inst.cfg b/resources/quality/extra_coarse.inst.cfg index 4c2bced7d2..921cfbb981 100644 --- a/resources/quality/extra_coarse.inst.cfg +++ b/resources/quality/extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = Extra coarse global_quality = True weight = -4 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.6 diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg index d9965f0829..695d500198 100644 --- a/resources/quality/high.inst.cfg +++ b/resources/quality/high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high global_quality = True weight = 1 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg index 674ed17e44..2c0dc434ee 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg index e98c0a38ee..f9327873dd 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm_2-fans weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg index 2a947aceec..16ec2d9f1e 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg index 67078b9cde..3302402233 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm_2-fans weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg index c82d42120d..8ed78edfed 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg index 634b1219f7..845f03873d 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg index 9d1ece2ea9..b587b64fef 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg index 2cc8a57a73..c4a4b4f465 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg index c30943b4f2..7f2c4ce316 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg index 076d90334b..43bb14577b 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg index c8db03506a..253a3a2dc3 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = 2 quality_type = ultrahigh -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg index 01d5d601dd..8152b9a0c8 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = 2 quality_type = ultrahigh -setting_version = 1 +setting_version = 2 [values] adhesion_type = skirt diff --git a/resources/quality/low.inst.cfg b/resources/quality/low.inst.cfg index 8c8200395b..466d741d5f 100644 --- a/resources/quality/low.inst.cfg +++ b/resources/quality/low.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = low global_quality = True weight = -1 -setting_version = 1 +setting_version = 2 [values] infill_sparse_density = 10 diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg index b945e1e94f..0b4cec96d9 100644 --- a/resources/quality/normal.inst.cfg +++ b/resources/quality/normal.inst.cfg @@ -8,6 +8,6 @@ type = quality quality_type = normal global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg b/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg index 187462b4e5..d5e02e6c71 100644 --- a/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg +++ b/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg @@ -7,7 +7,7 @@ definition = peopoly_moai type = quality weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] infill_sparse_density = 70 diff --git a/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg b/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg index 720b98b1b0..a3c4913e5f 100644 --- a/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg +++ b/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg @@ -7,7 +7,7 @@ definition = peopoly_moai type = quality weight = 2 quality_type = extra_high -setting_version = 1 +setting_version = 2 [values] infill_sparse_density = 70 diff --git a/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg b/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg index faad40dc70..a9c52b0c27 100644 --- a/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg +++ b/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg @@ -7,7 +7,7 @@ definition = peopoly_moai type = quality weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] infill_sparse_density = 70 diff --git a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg index e17051a56d..1a7bbc79a9 100644 --- a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg index 19d09b9e5c..4618a37d2f 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg index 342629e87a..e5239e9a46 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg index 9da2847b2a..2b4a47b99c 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg index 1c65c2acb1..b6b2f1392f 100644 --- a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ material = generic_pla_ultimaker2_plus_0.6_mm type = quality weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg index 28de80d60f..23616e6b39 100644 --- a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ material = generic_pla_ultimaker2_plus_0.8_mm type = quality weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg index 946e524d87..20fa84d691 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg index 0e0235184d..88eed9f9e8 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg index 302e3951d1..3af57d6a09 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg index 028ee1c0ea..ca57521636 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg index 545b1e4776..b9232c850c 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg index 772fe1f8c8..b3c4ed84c1 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.8_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg index a9c64db3de..c8f82ea938 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.25_mm weight = -1 quality_type = high -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg index d953b1e44b..e3bb676205 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg index db295419a1..73c613fd85 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg index 0801789185..fa708fea78 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg index f57b4acd75..268fb9571f 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg index 0a5285dcf3..585680b387 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.8_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg index 8e3ee22877..25e1190d16 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.4_mm weight = -2 quality_type = draft -setting_version = 1 +setting_version = 2 [values] speed_wall_x = 25 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg index b43b6acbb1..f0dab0b80b 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] speed_wall_x = 30 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg index 9bd1597170..09f540395b 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.6_mm weight = -2 quality_type = draft -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg index a914f1f88a..055177e14e 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg index 020b50b61a..795867c59c 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.8_mm weight = -2 quality_type = draft -setting_version = 1 +setting_version = 2 [values] support_z_distance = 0.26 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg index ca84a137da..a40b30730d 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.8_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_z_distance = 0.26 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg index ff517a6bc0..569ddb69bf 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg index 0dd6836896..740205d102 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.25_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg index 3c4748ecf7..143f8c1a71 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg index 6d94746c18..d406a8fa7f 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg index 6a00f13b8e..f3f9fddfbe 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.7 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg index 5a5c39fc2b..6810970eb5 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.7 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg index 4c8aea5b29..aaba4b8a50 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.8_mm weight = -2 quality_type = draft -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.75 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg index b959cb3189..fae14c8266 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.8_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.75 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg index d0b2daabb8..97b5446d10 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] support_z_distance = 0.19 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg index 4b68931888..57101394b3 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.25_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_z_distance = 0.19 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg index 873fb92a37..334ca6fde2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] speed_wall_x = 30 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg index 1b7ecd58b8..0d815cfdc3 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] speed_wall_x = 30 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg index c062bc9900..0e5cacbeac 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] speed_travel = 150 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg index d1edaa628b..3c7f0ef212 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] speed_travel = 150 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg index 4887d4ca43..280dafa128 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.8_mm weight = -2 quality_type = draft -setting_version = 1 +setting_version = 2 [values] support_z_distance = 0.26 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg index 9719ebec64..e79d3339f2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.8_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_z_distance = 0.26 diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg index 864381cfa2..0aa08a65b8 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.25_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 supported = False [values] diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index d174711666..558e314581 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index af99ae18b0..668899184f 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index 9279a752a2..f3db281962 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.6_mm weight = -2 quality_type = draft -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index b9f07460c6..ffefbcf4c7 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 40650f71d6..380c54cbc4 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.8_mm weight = -2 quality_type = fast -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 11e7c0b08d..84a95eab17 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.8_mm weight = -3 quality_type = draft -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg index 36a8c479a7..afa7c89fd5 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_tpu_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.6 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg index 00e4b59181..205cc25285 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_tpu_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.65 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg index ed15c13f94..ab696e84bb 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_tpu_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 1 +setting_version = 2 [values] support_xy_distance = 0.7 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg index 15fdb08c92..e9a2667261 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_abs_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] machine_nozzle_cool_down_speed = 0.85 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg index ada4357f2b..96099347bd 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_abs_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] cool_min_speed = 7 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg index 3582df61e1..47c3602277 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_ultimaker3_AA_0.4 weight = 1 -setting_version = 1 +setting_version = 2 [values] cool_min_speed = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg index 25b9ed51b5..dcb29b48c6 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] machine_nozzle_cool_down_speed = 0.85 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg index 44cd4540d5..2ae57b6333 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_plus_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg index a0d09c97c2..6fbc466b61 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_cpe_plus_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg index ebd7cd2d07..58719ca037 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_cpe_plus_ultimaker3_AA_0.4 weight = 1 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg index 96cbc59a48..89dc4e5df5 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_cpe_plus_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg index 2c18b4baea..354efee6ef 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg index 0d3321f0a8..ceab77fc4f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_cpe_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] cool_min_speed = 7 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg index baa1e2e785..edfe91c8a1 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_cpe_ultimaker3_AA_0.4 weight = 1 -setting_version = 1 +setting_version = 2 [values] cool_min_speed = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg index 4331fe5a0f..1487d476f0 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_cpe_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] machine_nozzle_cool_down_speed = 0.85 diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg index b748fd50c7..6d33e4298a 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_nylon_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg index b4e7b6ae83..189d8efbae 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_nylon_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg index 488415a75c..70a72beb50 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_ultimaker3_AA_0.4 weight = 1 -setting_version = 1 +setting_version = 2 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg index ec6c409d19..324300d11f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg index aca060286b..a88e38b560 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg @@ -1,65 +1,65 @@ -[general] -version = 2 -name = Fast -definition = ultimaker3 - -[metadata] -type = quality -quality_type = draft -material = generic_pc_ultimaker3_AA_0.4 -weight = -2 -setting_version = 1 - -[values] -acceleration_enabled = True -acceleration_print = 4000 -adhesion_type = raft -brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + layer_height -cool_fan_speed_max = 90 -cool_min_layer_time_fan_speed_max = 5 -cool_min_speed = 6 -infill_line_width = =round(line_width * 0.4 / 0.35, 2) -infill_overlap = 0 -infill_overlap_mm = 0.05 -infill_pattern = triangles -infill_wipe_dist = 0.1 -jerk_enabled = True -jerk_print = 25 -layer_height = 0.2 -machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 10 -material_initial_print_temperature = =material_print_temperature - 5 -material_print_temperature = =default_material_print_temperature + 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -ooze_shield_angle = 40 -prime_tower_enable = True -prime_tower_wipe_enabled = True -raft_airgap = 0.25 -raft_interface_thickness = =max(layer_height * 1.5, 0.225) -retraction_count_max = 80 -retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 -retraction_prime_speed = 15 -skin_overlap = 30 -speed_layer_0 = 25 -speed_print = 50 -speed_topbottom = 25 -speed_travel = 250 -speed_wall = =math.ceil(speed_print * 40 / 50) -speed_wall_0 = =math.ceil(speed_wall * 25 / 40) -support_bottom_distance = =support_z_distance -support_interface_density = 87.5 -support_interface_pattern = lines -switch_extruder_prime_speed = 15 -switch_extruder_retraction_amount = 20 -switch_extruder_retraction_speeds = 35 -wall_0_inset = 0 -wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) -wall_thickness = 1.2 +[general] +version = 2 +name = Fast +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_pc_ultimaker3_AA_0.4 +weight = -2 +setting_version = 2 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = raft +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 90 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 6 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap = 0 +infill_overlap_mm = 0.05 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +layer_height = 0.2 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 25 +speed_travel = 250 +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg index 18b51bb319..242cca1ecf 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg @@ -1,64 +1,64 @@ -[general] -version = 2 -name = Normal -definition = ultimaker3 - -[metadata] -type = quality -quality_type = fast -material = generic_pc_ultimaker3_AA_0.4 -weight = -1 -setting_version = 1 - -[values] -acceleration_enabled = True -acceleration_print = 4000 -adhesion_type = raft -brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + layer_height -cool_fan_speed_max = 85 -cool_min_layer_time_fan_speed_max = 5 -cool_min_speed = 7 -infill_line_width = =round(line_width * 0.4 / 0.35, 2) -infill_overlap_mm = 0.05 -infill_pattern = triangles -infill_wipe_dist = 0.1 -jerk_enabled = True -jerk_print = 25 -layer_height = 0.15 -machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 10 -material_initial_print_temperature = =material_print_temperature - 5 -material_print_temperature = =default_material_print_temperature + 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -ooze_shield_angle = 40 -prime_tower_enable = True -prime_tower_wipe_enabled = True -raft_airgap = 0.25 -raft_interface_thickness = =max(layer_height * 1.5, 0.225) -retraction_count_max = 80 -retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 -retraction_prime_speed = 15 -skin_overlap = 30 -speed_layer_0 = 25 -speed_print = 50 -speed_topbottom = 25 -speed_travel = 250 -speed_wall = =math.ceil(speed_print * 40 / 50) -speed_wall_0 = =math.ceil(speed_wall * 25 / 40) -support_bottom_distance = =support_z_distance -support_interface_density = 87.5 -support_interface_pattern = lines -switch_extruder_prime_speed = 15 -switch_extruder_retraction_amount = 20 -switch_extruder_retraction_speeds = 35 -wall_0_inset = 0 -wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) -wall_thickness = 1.2 +[general] +version = 2 +name = Normal +definition = ultimaker3 + +[metadata] +type = quality +quality_type = fast +material = generic_pc_ultimaker3_AA_0.4 +weight = -1 +setting_version = 2 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = raft +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 85 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 7 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap_mm = 0.05 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +layer_height = 0.15 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 25 +speed_travel = 250 +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg index f266323c33..51b025c7c6 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg @@ -1,65 +1,65 @@ -[general] -version = 2 -name = Extra Fine -definition = ultimaker3 - -[metadata] -type = quality -quality_type = high -material = generic_pc_ultimaker3_AA_0.4 -weight = 1 -setting_version = 1 - -[values] -acceleration_enabled = True -acceleration_print = 4000 -adhesion_type = raft -brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + layer_height -cool_fan_speed_max = 50 -cool_min_layer_time_fan_speed_max = 5 -cool_min_speed = 8 -infill_line_width = =round(line_width * 0.4 / 0.35, 2) -infill_overlap = 0 -infill_overlap_mm = 0.05 -infill_pattern = triangles -infill_wipe_dist = 0.1 -jerk_enabled = True -jerk_print = 25 -layer_height = 0.06 -machine_min_cool_heat_time_window = 15 -machine_nozzle_cool_down_speed = 0.85 -machine_nozzle_heat_up_speed = 1.5 -material_final_print_temperature = =material_print_temperature - 10 -material_initial_print_temperature = =material_print_temperature - 5 -material_print_temperature = =default_material_print_temperature - 10 -material_standby_temperature = 100 -multiple_mesh_overlap = 0 -ooze_shield_angle = 40 -prime_tower_enable = True -prime_tower_wipe_enabled = True -raft_airgap = 0.25 -raft_interface_thickness = =max(layer_height * 1.5, 0.225) -retraction_count_max = 80 -retraction_extrusion_window = 1 -retraction_hop = 2 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 -retraction_prime_speed = 15 -skin_overlap = 30 -speed_layer_0 = 25 -speed_print = 50 -speed_topbottom = 25 -speed_travel = 250 -speed_wall = =math.ceil(speed_print * 40 / 50) -speed_wall_0 = =math.ceil(speed_wall * 25 / 40) -support_bottom_distance = =support_z_distance -support_interface_density = 87.5 -support_interface_pattern = lines -switch_extruder_prime_speed = 15 -switch_extruder_retraction_amount = 20 -switch_extruder_retraction_speeds = 35 -wall_0_inset = 0 -wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) -wall_thickness = 1.2 +[general] +version = 2 +name = Extra Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = high +material = generic_pc_ultimaker3_AA_0.4 +weight = 1 +setting_version = 2 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = raft +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 50 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 8 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap = 0 +infill_overlap_mm = 0.05 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +layer_height = 0.06 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 25 +speed_travel = 250 +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg index 86e6cb85e2..23449bcda2 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg index 89c7717ca8..46f043ce65 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pla_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg index a4507e5a2b..10a04ed47b 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_pla_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg index 99cb9693d3..27d4b20815 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_ultimaker3_AA_0.4 weight = 1 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg index f3719a875c..94e82ede57 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg index 8b5f0aa085..4228c718c6 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pp_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg index de78433c78..850ead9120 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_pp_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg index c15d2a4f49..e68f13364a 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pp_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg index 6d878cd4b7..2ce06b2de2 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ type = quality quality_type = normal material = generic_pva_ultimaker3_AA_0.4 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index 3ed8a5e13d..7450e7112d 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_tpu_ultimaker3_AA_0.4 weight = -2 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index 9f2b4cc718..2d07cd8b31 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_tpu_ultimaker3_AA_0.4 weight = -1 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index f30e20cf14..1d8467482f 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_tpu_ultimaker3_AA_0.4 weight = 0 -setting_version = 1 +setting_version = 2 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg index 7dd0957b28..41dee1edf4 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_abs_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] line_width = =machine_nozzle_size * 0.875 diff --git a/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg index 31b091e65d..d757ca32a0 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_abs_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.4 diff --git a/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg index 100307250f..9f5fddf21b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_abs_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.3 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg index d40d9430d1..80b80978d1 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_plus_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index c6eca25b0d..8a16b26682 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_cpe_plus_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index bb3cfbd9f4..bd5b8972b1 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_cpe_plus_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg index 354e1a2d08..d920d76417 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] brim_width = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg index ad7306ed13..480d63a698 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_cpe_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] brim_width = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg index f3ce457682..c1d48f2555 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_cpe_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] brim_width = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg index 09c95691d5..ec8ba37518 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_nylon_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] brim_width = 5.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg index 75891c1be2..90f04b1e8a 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_nylon_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] brim_width = 5.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg index 9ac7ba8668..7980541f32 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_nylon_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] brim_width = 5.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg index 9ee1889620..18c82b1e2c 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pc_ultimaker3_AA_0.8 weight = 0 -setting_version = 1 +setting_version = 2 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg index 011c95a0a5..328c5d9f1d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_pc_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg index dbaa4806cb..27ecd7343f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_pc_ultimaker3_AA_0.8 weight = -1 -setting_version = 1 +setting_version = 2 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg index 58d1871d0d..c528a2523f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pla_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg index 7dcaabb562..f0f375c7ee 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_pla_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg index dc45dda559..aabdf1213d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_pla_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index e81a99b83d..8b85d6d7fb 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pp_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] brim_width = 25 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index 2e23333042..f1042df045 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_pp_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] brim_width = 25 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index a0e643c5b5..2ddb591127 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_pp_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] brim_width = 25 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg index abbfe3f184..9da6595ec8 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ type = quality quality_type = normal material = generic_pva_ultimaker3_AA_0.8 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg index ddd2dd6ca9..ddecefa938 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ type = quality quality_type = superdraft material = generic_pva_ultimaker3_AA_0.8 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 1df3d49cd0..97deea6740 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_tpu_ultimaker3_AA_0.8 weight = -2 -setting_version = 1 +setting_version = 2 [values] brim_width = 8.75 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index 106aa800b3..7871f330cc 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_tpu_ultimaker3_AA_0.8 weight = -4 -setting_version = 1 +setting_version = 2 [values] brim_width = 8.75 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index 66d6b3b77d..9da9e3945f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_tpu_ultimaker3_AA_0.8 weight = -3 -setting_version = 1 +setting_version = 2 [values] brim_width = 8.75 diff --git a/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg index 31d74c33a6..c1271f68e8 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_abs_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg index 16cc6c76b7..3d4843a07a 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_abs_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg index ef3ae39c9a..355b9fd390 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_cpe_plus_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg index f6a5338f41..3b5c086e13 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_cpe_plus_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg index 4c05ed019e..695185da03 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_cpe_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg index 9401ac061d..4cd4dd4c18 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_cpe_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg index b2db6334c0..29f550fe59 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_nylon_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg index ac99f78d04..c40458ecbe 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_nylon_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg index dfba41dfb6..78c4413c5e 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_pc_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg index 1b831fd1e2..1f0a724e55 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_pla_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg index 153ae27d12..6c84ab05a6 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_pla_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg index 43bb096ebf..7b042d9375 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft weight = -2 material = generic_pva_ultimaker3_BB_0.4 -setting_version = 1 +setting_version = 2 [values] material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg index c78833b867..0f78ea0860 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ weight = -1 type = quality quality_type = fast material = generic_pva_ultimaker3_BB_0.4 -setting_version = 1 +setting_version = 2 [values] material_print_temperature = =default_material_print_temperature + 5 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg index b244b3b2da..7e335a01ae 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg @@ -8,7 +8,7 @@ weight = 1 type = quality quality_type = high material = generic_pva_ultimaker3_BB_0.4 -setting_version = 1 +setting_version = 2 [values] material_standby_temperature = 100 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg index 7896b5a57a..472b0ce51b 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ weight = 0 type = quality quality_type = normal material = generic_pva_ultimaker3_BB_0.4 -setting_version = 1 +setting_version = 2 [values] material_standby_temperature = 100 diff --git a/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg index 106ef29f8e..f71989d851 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_tpu_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg index 95e0622c1a..13734f3947 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_tpu_ultimaker3_BB_0.4 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg index def07a3a80..55026ddcbc 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_abs_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg index fe4ec5bbc6..2b2aa5acd2 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_abs_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg index 279e1c9c89..1165d6ab2c 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_cpe_plus_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg index 3490da81a6..7a309e4abc 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_cpe_plus_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg index b70fe13061..97fc8408d0 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_cpe_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg index 137a651ddd..543ce9fcc6 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_cpe_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg index dfbf2754e2..3030decc57 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_nylon_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg index 9242228f50..ff2b83a685 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_nylon_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg index f206fd4368..30c55627fa 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_pc_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg index cb18b565d7..7496e68bf6 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_pc_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg index 223b5a06fe..2acbc9713a 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_pla_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg index a4f6a6dfeb..2c64ccef98 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_pla_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg index fd3a392a23..b19f9811a8 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft weight = -2 material = generic_pva_ultimaker3_BB_0.8 -setting_version = 1 +setting_version = 2 [values] material_print_temperature = =default_material_print_temperature + 5 diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg index d987e3b61c..4d9f61e628 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft weight = -4 material = generic_pva_ultimaker3_BB_0.8 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.4 diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg index 612e2a1de9..3b6bb267dc 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft weight = -3 material = generic_pva_ultimaker3_BB_0.8 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.3 diff --git a/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg index 84e5c6d3d3..17e2bf7ba1 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg @@ -9,6 +9,6 @@ quality_type = normal material = generic_tpu_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg index 222a4935d5..1369ee6d41 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg @@ -9,6 +9,6 @@ quality_type = superdraft material = generic_tpu_ultimaker3_BB_0.8 weight = 0 supported = False -setting_version = 1 +setting_version = 2 [values] diff --git a/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg index 2bca653fb7..e564a6ee56 100644 --- a/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft global_quality = True weight = -2 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg index f8d869b65c..435d8cc84f 100644 --- a/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast global_quality = True weight = -1 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg index 6deaf1127b..5917a4bd41 100644 --- a/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg index 67dc2b4b1f..fd16913dcf 100644 --- a/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal global_quality = True weight = 0 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg index 1f095a71e4..a2ed2c55ff 100644 --- a/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft global_quality = True weight = -4 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.4 diff --git a/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg index 324e007653..0e12596a8d 100644 --- a/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft global_quality = True weight = -3 -setting_version = 1 +setting_version = 2 [values] layer_height = 0.3 From 5bf080950ff9cb5f5f51dbac13df07ef91343545 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 14:07:42 +0200 Subject: [PATCH 221/379] Fix upgrade from 2.5 to 2.6 to 2.7 CURA-3975 - Set Preferences setting_version in CuraApplication so Preferences can get upgraded correctly - Fix upgrade script for 2.5 to 2.6 - Fix upgrade script for 2.6 to 2.7 which relies on the upgrade of 2.5 to 2.6 --- cura/CuraApplication.py | 4 +- .../VersionUpgrade25to26.py | 7 ++- .../VersionUpgrade26to27.py | 55 +++++++++++++++++-- .../VersionUpgrade26to27/__init__.py | 31 +++++++++++ 4 files changed, 91 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6321dbf670..c3477ed252 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -26,7 +26,6 @@ from UM.Settings.Validator import Validator from UM.Message import Message from UM.i18n import i18nCatalog from UM.Workspace.WorkspaceReader import WorkspaceReader -from UM.Platform import Platform from UM.Decorators import deprecated from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation @@ -268,6 +267,9 @@ class CuraApplication(QtApplication): with ContainerRegistry.getInstance().lockFile(): ContainerRegistry.getInstance().load() + # set the setting version for Preferences + Preferences.getInstance().setSettingVersion(CuraApplication.SettingVersion) + Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/categories_expanded", "") diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py index d3e22ba5d2..7d728884cb 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py @@ -61,8 +61,13 @@ class VersionUpgrade25to26(VersionUpgrade): parser["general"]["visible_settings"] = ";".join(new_visible_settings) #Change the version number in the file. + if "general" not in parser: + parser["general"] = {} parser.set("general", "version", "4") - parser.set("general", "setting_version", "1") + + if "metadata" not in parser: + parser["metadata"] = {} + parser.set("metadata", "setting_version", "1") #Re-serialise the file. output = io.StringIO() diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py index 38031765d5..e2d7817077 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/VersionUpgrade26to27.py @@ -87,6 +87,50 @@ class VersionUpgrade26to27(VersionUpgrade): setting_version = int(parser.get("metadata", "setting_version", fallback = 0)) return format_version * 1000000 + setting_version + ## Upgrades a preferences file from version 2.6 to 2.7. + # + # \param serialised The serialised form of a preferences file. + # \param filename The name of the file to upgrade. + def upgradePreferences(self, serialised, filename): + parser = configparser.ConfigParser(interpolation=None) + parser.read_string(serialised) + + # Update version numbers + if "general" not in parser: + parser["general"] = {} + parser["general"]["version"] = "4" + + if "metadata" not in parser: + parser["metadata"] = {} + parser["metadata"]["setting_version"] = "2" + + # Re-serialise the file. + output = io.StringIO() + parser.write(output) + return [filename], [output.getvalue()] + + ## Upgrades a container file other than a container stack file from version 2.6 to 2.7. + # + # \param serialised The serialised form of a container file. + # \param filename The name of the file to upgrade. + def upgradeOtherContainer(self, serialised, filename): + parser = configparser.ConfigParser(interpolation=None) + parser.read_string(serialised) + + # Update version numbers + if "general" not in parser: + parser["general"] = {} + parser["general"]["version"] = "2" + + if "metadata" not in parser: + parser["metadata"] = {} + parser["metadata"]["setting_version"] = "2" + + # Re-serialise the file. + output = io.StringIO() + parser.write(output) + return [filename], [output.getvalue()] + ## Upgrades a container stack from version 2.6 to 2.7. # # \param serialised The serialised form of a container stack. @@ -108,12 +152,15 @@ class VersionUpgrade26to27(VersionUpgrade): if not parser.has_section(each_section): parser.add_section(each_section) - # Change the version number in the file. - parser["metadata"]["setting_version"] = str(CuraApplication.SettingVersion) - - # Update version + # Update version numbers + if "general" not in parser: + parser["general"] = {} parser["general"]["version"] = "3" + if "metadata" not in parser: + parser["metadata"] = {} + parser["metadata"]["setting_version"] = "2" + # Re-serialise the file. output = io.StringIO() parser.write(output) diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py index 8ddf4aa7ea..b0c0d70ae2 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py @@ -14,6 +14,21 @@ def getMetaData(): # From To Upgrade function ("machine_stack", 3000000): ("machine_stack", 3000002, upgrade.upgradeStack), ("extruder_train", 3000000): ("extruder_train", 3000002, upgrade.upgradeStack), + + # In 2.6.x, Preferences are saved with "version = 4" and no setting_version. + # This means those Preferences files will still be treated as "4.0" as defined in VersionUpgrade25to26, + # so the 25to26 upgrade routine will be called again. + # + # To fix this, we first fix the upgrade routine for 25to26 so it actually upgrades to "4.1", and then + # here we can upgrade from "4.1" to "4.2" safely. + # + ("preferences", 4000001): ("preferences", 4000002, upgrade.upgradePreferences), + # NOTE: All the instance containers share the same general/version, so we have to update all of them + # if any is updated. + ("quality_changes", 2000001): ("quality_changes", 2000002, upgrade.upgradeOtherContainer), + ("user", 2000001): ("user", 2000002, upgrade.upgradeOtherContainer), + ("quality", 2000001): ("quality", 2000002, upgrade.upgradeOtherContainer), + ("definition_changes", 2000001): ("definition_changes", 2000002, upgrade.upgradeOtherContainer), }, "sources": { "machine_stack": { @@ -24,6 +39,22 @@ def getMetaData(): "get_version": upgrade.getCfgVersion, "location": {"./extruders"} }, + "preferences": { + "get_version": upgrade.getCfgVersion, + "location": {"."} + }, + "quality_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./quality"} + }, + "user": { + "get_version": upgrade.getCfgVersion, + "location": {"./user"} + }, + "definition_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./machine_instances"} + } } } From b4949a164c887ca09bd4d8e6ed34f124ec0430bd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 14:17:01 +0200 Subject: [PATCH 222/379] WIP: Add temporary fix to make materials work with 2.7 version upgrade CURA-3975 This is a temporary fix to make materials work with 2.7 version upgrade because of the setting_version change from 1 to 2. This MUST be fixed after we have decided on how to determine the versions of an XMLMaterialProfile. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 4 ++++ plugins/XmlMaterialProfile/XmlMaterialUpgrader.py | 4 ++++ plugins/XmlMaterialProfile/__init__.py | 2 ++ 3 files changed, 10 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 04fc09019b..9319280119 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -36,6 +36,10 @@ class XmlMaterialProfile(InstanceContainer): # \param xml_version: The version number found in an XML file. # \return The corresponding setting_version. def xmlVersionToSettingVersion(self, xml_version: str) -> int: + if xml_version == "1.3": + return 2 # FIXME & HACK: This is temporary hack. The setting_version has been increased in CuraApplication, + # but we haven't decided on how to determine the versions of an XMLMaterialProfile yet. + # This MUST be fixed after the decision has been made. if xml_version == "1.3": return 1 return 0 #Older than 1.3. diff --git a/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py b/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py index ad20a44c28..140c0712a3 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py +++ b/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py @@ -20,6 +20,10 @@ class XmlMaterialUpgrader(VersionUpgrade): return version * 1000000 + setting_version def _xmlVersionToSettingVersion(self, xml_version: str) -> int: + if xml_version == "1.3": + return 2 # FIXME & HACK: This is temporary hack. The setting_version has been increased in CuraApplication, + # but we haven't decided on how to determine the versions of an XMLMaterialProfile yet. + # This MUST be fixed after the decision has been made. if xml_version == "1.3": return 1 return 0 #Older than 1.3. diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py index 63ec979fbd..3effe702be 100644 --- a/plugins/XmlMaterialProfile/__init__.py +++ b/plugins/XmlMaterialProfile/__init__.py @@ -20,6 +20,8 @@ def getMetaData(): }, "version_upgrade": { ("materials", 1000000): ("materials", 1000001, upgrader.upgradeMaterial), + # FIXME: This needs to be changed once we have decided on how to determine the versions + ("materials", 1000001): ("materials", 1000002, upgrader.upgradeMaterial), }, "sources": { "materials": { From b95426bee3f68904908d3b9ca32ef255466b8e22 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 14:32:59 +0200 Subject: [PATCH 223/379] Add setting_version for Preferences CURA-3975 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c3477ed252..048973c5c4 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -268,7 +268,7 @@ class CuraApplication(QtApplication): ContainerRegistry.getInstance().load() # set the setting version for Preferences - Preferences.getInstance().setSettingVersion(CuraApplication.SettingVersion) + Preferences.getInstance().addPreference("metadata/setting_version", CuraApplication.SettingVersion) Preferences.getInstance().addPreference("cura/active_mode", "simple") From 071005541c4174e0eaea0a9a22d3e29825eeb13e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jul 2017 14:47:56 +0200 Subject: [PATCH 224/379] Use XMLMaterialProfile version tag to determine its version CURA-2724 --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 9 ++------- plugins/XmlMaterialProfile/XmlMaterialUpgrader.py | 6 +----- plugins/XmlMaterialProfile/__init__.py | 4 +--- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 9319280119..b6b3e0671c 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -12,9 +12,8 @@ from UM.Util import parseBool from cura.CuraApplication import CuraApplication import UM.Dictionary -from UM.Settings.InstanceContainer import InstanceContainer, InvalidInstanceError +from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry -from cura.Settings.CuraContainerRegistry import CuraContainerRegistry ## Handles serializing and deserializing material containers from an XML file @@ -37,11 +36,7 @@ class XmlMaterialProfile(InstanceContainer): # \return The corresponding setting_version. def xmlVersionToSettingVersion(self, xml_version: str) -> int: if xml_version == "1.3": - return 2 # FIXME & HACK: This is temporary hack. The setting_version has been increased in CuraApplication, - # but we haven't decided on how to determine the versions of an XMLMaterialProfile yet. - # This MUST be fixed after the decision has been made. - if xml_version == "1.3": - return 1 + return 2 return 0 #Older than 1.3. def getInheritedFiles(self): diff --git a/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py b/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py index 140c0712a3..c93c476c2e 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py +++ b/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py @@ -21,11 +21,7 @@ class XmlMaterialUpgrader(VersionUpgrade): def _xmlVersionToSettingVersion(self, xml_version: str) -> int: if xml_version == "1.3": - return 2 # FIXME & HACK: This is temporary hack. The setting_version has been increased in CuraApplication, - # but we haven't decided on how to determine the versions of an XMLMaterialProfile yet. - # This MUST be fixed after the decision has been made. - if xml_version == "1.3": - return 1 + return 2 return 0 #Older than 1.3. def upgradeMaterial(self, serialised, filename): diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py index 3effe702be..6ad4a279d0 100644 --- a/plugins/XmlMaterialProfile/__init__.py +++ b/plugins/XmlMaterialProfile/__init__.py @@ -19,9 +19,7 @@ def getMetaData(): "mimetype": "application/x-ultimaker-material-profile" }, "version_upgrade": { - ("materials", 1000000): ("materials", 1000001, upgrader.upgradeMaterial), - # FIXME: This needs to be changed once we have decided on how to determine the versions - ("materials", 1000001): ("materials", 1000002, upgrader.upgradeMaterial), + ("materials", 1000000): ("materials", 1000002, upgrader.upgradeMaterial), }, "sources": { "materials": { From ad87f154f3ca7b60543276e66dda3afe9895f970 Mon Sep 17 00:00:00 2001 From: tsaaristo Date: Thu, 6 Jul 2017 15:56:08 +0300 Subject: [PATCH 225/379] Speed up sidebar-settings scrolling Scroll three rows in one scroll event instead of one --- resources/qml/Settings/SettingView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 06e53cc03b..822322ad2d 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -142,6 +142,7 @@ Item style: UM.Theme.styles.scrollview; flickableItem.flickableDirection: Flickable.VerticalFlick; + __wheelAreaScrollSpeed: 75; // Scroll three lines in one scroll event ListView { From ef89fab1269cc595fda15ea03d9760789efc3d29 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 6 Jul 2017 16:13:42 +0200 Subject: [PATCH 226/379] Fix spaces after comma according to code style Contributes to issue CURA-3587. --- resources/qml/Preferences/GeneralPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 92a768051e..260c23c4ba 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -364,9 +364,9 @@ UM.PreferencesPage CheckBox { id: zoomToMouseCheckbox - text: catalog.i18nc("@action:button","Zoom toward mouse direction"); + text: catalog.i18nc("@action:button", "Zoom toward mouse direction"); checked: boolCheck(UM.Preferences.getValue("view/zoom_to_mouse")) - onClicked: UM.Preferences.setValue("view/zoom_to_mouse", checked) + onClicked: UM.Preferences.setValue("view/zoom_to_mouse", checked) } } From fc70715cd1ea3b45c7a188b0ad8a61c73cb31e05 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 7 Jul 2017 10:31:26 +0200 Subject: [PATCH 227/379] Fixed plugin installing for windows CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 3957fcb9a4..49405c4272 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -102,8 +102,10 @@ class PluginBrowser(QObject, Extension): self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") self._temp_plugin_file.write(self._download_plugin_reply.readAll()) - - result = PluginRegistry.getInstance().installPlugin("file://" + self._temp_plugin_file.name) + location = self._temp_plugin_file.name + if not location.startswith("/"): + location = "/" + location # Ensure that it starts with a /, as otherwise it doesn't work on windows. + result = PluginRegistry.getInstance().installPlugin("file://" + location) self._newly_installed_plugin_ids.append(result["id"]) self.pluginsMetadataChanged.emit() From 44a22cbd3a6d501d22b8da8c72d554a02de06cbf Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 7 Jul 2017 10:41:44 +0200 Subject: [PATCH 228/379] Removed binding loops CURA-3856 --- plugins/PluginBrowser/PluginBrowser.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index fc9612a798..9c2ad1bc67 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -55,7 +55,7 @@ UM.Dialog { id: bottomBar width: parent.width - height: childrenRect.height + height: closeButton.height anchors.bottom:parent.bottom anchors.left: parent.left ProgressBar @@ -92,10 +92,11 @@ UM.Dialog Rectangle { width: pluginList.width; - height: childrenRect.height; + height: texts.height; color: index % 2 ? palette.base : palette.alternateBase Column { + id: texts width: parent.width height: childrenRect.height anchors.left: parent.left @@ -128,7 +129,6 @@ UM.Dialog anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading - } } From 8827b02020ca4478e7f2fc63b7c1ec4632b9f16b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 7 Jul 2017 10:48:25 +0200 Subject: [PATCH 229/379] Create persistent temporary file on Windows for plugins CURA-3856 --- plugins/PluginBrowser/PluginBrowser.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 49405c4272..ee1b8906da 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -100,9 +100,16 @@ class PluginBrowser(QObject, Extension): if new_progress == 100.0: self.setIsDownloading(False) self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) - self._temp_plugin_file = tempfile.NamedTemporaryFile(suffix = ".curaplugin") - self._temp_plugin_file.write(self._download_plugin_reply.readAll()) + + # must not delete the temporary file on Windows + self._temp_plugin_file = tempfile.NamedTemporaryFile(mode = "w+b", suffix = ".curaplugin", delete = False) location = self._temp_plugin_file.name + + # write first and close, otherwise on Windows, it cannot read the file + self._temp_plugin_file.write(self._download_plugin_reply.readAll()) + self._temp_plugin_file.close() + + # open as read if not location.startswith("/"): location = "/" + location # Ensure that it starts with a /, as otherwise it doesn't work on windows. result = PluginRegistry.getInstance().installPlugin("file://" + location) From 0a163439a492f5c6901cf19051988a7ea924282f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 7 Jul 2017 12:03:05 +0200 Subject: [PATCH 230/379] Use system-style progress bar. --- plugins/PluginBrowser/PluginBrowser.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 9c2ad1bc67..e9b0fb6021 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -62,13 +62,11 @@ UM.Dialog { id: progressbar anchors.bottom: parent.bottom - style: UM.Theme.styles.progressbar minimumValue: 0; maximumValue: 100 anchors.left:parent.left anchors.right: closeButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width - height: 10 value: manager.downloadProgress } From 6b05bd21fbbaad3b70de1104991e4c56f48dc395 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 7 Jul 2017 12:11:54 +0200 Subject: [PATCH 231/379] Show why the download button is disabled --- plugins/PluginBrowser/PluginBrowser.qml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index e9b0fb6021..f9cff06898 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -67,7 +67,7 @@ UM.Dialog anchors.left:parent.left anchors.right: closeButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width - value: manager.downloadProgress + value: manager.isDownloading ? manager.downloadProgress : 0 } Button @@ -121,7 +121,18 @@ UM.Dialog Button { id: downloadButton - text: (model.already_installed && model.can_upgrade) ? catalog.i18nc("@action:button", "Upgrade") : catalog.i18nc("@action:button", "Download") + text: + { + if (model.already_installed) + { + if (model.can_upgrade) + { + return catalog.i18nc("@action:button", "Upgrade"); + } + return catalog.i18nc("@action:button", "Installed"); + } + return catalog.i18nc("@action:button", "Download"); + } onClicked: manager.downloadAndInstallPlugin(model.file_location) anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width From 6503b87a3a431b8e4d9b6d18c857784d0079568e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 7 Jul 2017 12:30:58 +0200 Subject: [PATCH 232/379] Add a way to cancel a download and cancel download when closing the window --- plugins/PluginBrowser/PluginBrowser.py | 11 +++++++ plugins/PluginBrowser/PluginBrowser.qml | 42 ++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index ee1b8906da..76d4b4d284 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -141,6 +141,17 @@ class PluginBrowser(QObject, Extension): self.setIsDownloading(True) self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) + @pyqtSlot() + def cancelDownload(self): + Logger.log("i", "user cancelled the download of a plugin") + self._download_plugin_reply.abort() + self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) + self._download_plugin_reply = None + self._download_plugin_request = None + + self.setDownloadProgress(0) + self.setIsDownloading(False) + @pyqtProperty(QObject, notify=pluginsMetadataChanged) def pluginsModel(self): if self._plugins_model is None: diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index f9cff06898..7d7ade5d95 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -33,6 +33,7 @@ UM.Dialog text: catalog.i18nc("@action:button", "Refresh") onClicked: manager.requestPluginList() anchors.right: parent.right + enabled: !manager.isDownloading } } ScrollView @@ -48,6 +49,7 @@ UM.Dialog model: manager.pluginsModel anchors.fill: parent + property var activePlugin delegate: pluginDelegate } } @@ -75,7 +77,14 @@ UM.Dialog id: closeButton text: catalog.i18nc("@action:button", "Close") iconName: "dialog-close" - onClicked: base.close() + onClicked: + { + if (manager.isDownloading) + { + manager.cancelDownload() + } + base.close(); + } anchors.bottom: parent.bottom anchors.right: parent.right } @@ -123,7 +132,11 @@ UM.Dialog id: downloadButton text: { - if (model.already_installed) + if (manager.isDownloading && pluginList.activePlugin == model) + { + return catalog.i18nc("@action:button", "Cancel"); + } + else if (model.already_installed) { if (model.can_upgrade) { @@ -133,11 +146,32 @@ UM.Dialog } return catalog.i18nc("@action:button", "Download"); } - onClicked: manager.downloadAndInstallPlugin(model.file_location) + onClicked: + { + if(!manager.isDownloading) + { + pluginList.activePlugin = model; + manager.downloadAndInstallPlugin(model.file_location); + } + else + { + manager.cancelDownload(); + } + } anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter - enabled: (!model.already_installed || model.can_upgrade) && !manager.isDownloading + enabled: + { + if (manager.isDownloading) + { + return (pluginList.activePlugin == model); + } + else + { + return (!model.already_installed || model.can_upgrade); + } + } } } From e7eaeb41bdeaf8db4dc87213e9c78aa538d1fc7b Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 30 Jun 2017 18:22:08 +0200 Subject: [PATCH 233/379] setting: spaghetti_infill_extra_volume (CURA-3987) --- 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 9dac40f4e8..6c86ce9912 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4982,6 +4982,19 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, + "spaghetti_infill_extra_volume": + { + "label": "Spaghetti Infill Extra Volume", + "description": "A correction term to adjust the total volume being extruded each time when filling spaghetti.", + "unit": "mm³", + "type": "float", + "default_value": 0, + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "enabled": "infill_sparse_density > 0 and spaghetti_infill_enabled", + "limit_to_extruder": "infill_extruder_nr", + "settable_per_mesh": true + }, "support_conical_enabled": { "label": "Enable Conical Support", From d277b168070e251740798a4dbde89439b1b53ec1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 7 Jul 2017 13:08:28 +0200 Subject: [PATCH 234/379] Capitalise '3D' 3d looks ugly to me. --- resources/qml/SaveButton.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 411da0c392..2ea7dafc91 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the AGPLv3 or higher. import QtQuick 2.2 @@ -24,7 +24,7 @@ Item { { if(!activity) { - return catalog.i18nc("@label:PrintjobStatus", "Please load a 3d model"); + return catalog.i18nc("@label:PrintjobStatus", "Please load a 3D model"); } switch(base.backendState) From 4edd91de231e847d5f8a35c23a8aad96ba299dfb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 7 Jul 2017 13:37:02 +0200 Subject: [PATCH 235/379] Fig passing signals to topbar Topbar is now in the lead on whether the print monitor should be shown or not. As it should be. Contributes to issue CURA-4010. --- resources/qml/Cura.qml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b1e5c8f2f2..2c76bb0914 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the AGPLv3 or higher. import QtQuick 2.2 @@ -25,7 +25,14 @@ UM.MainWindow target: Printer onShowPrintMonitor: { - base.showPrintMonitor = show; + if (show) + { + topbar.startMonitoringPrint() + } + else + { + topbar.stopMonitoringPrint() + } } } From d9c6fc63f296b16831b943b146361a0566ba0f1f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 7 Jul 2017 14:59:35 +0200 Subject: [PATCH 236/379] Clarify description of skin overlap percentage setting It's unclear what this was a percentage of. Contributes to issue CURA-3892. --- 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 6c86ce9912..f5e86b18e1 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1340,7 +1340,7 @@ "skin_overlap": { "label": "Skin Overlap Percentage", - "description": "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin.", + "description": "The amount of overlap between the skin and the walls as a percentage of the line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall.", "unit": "%", "type": "float", "default_value": 5, From dcdc1a1f637bd0de341746e5313812ae11608429 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 7 Jul 2017 16:06:31 +0200 Subject: [PATCH 237/379] feat: print thin walls setting (CURA-4023) --- resources/definitions/fdmprinter.def.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6c86ce9912..116249431b 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1125,6 +1125,14 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, + "fill_outline_gaps": { + "label": "Print Thin Walls", + "description": "Print pieces of the model which are horizontally thinner than the nozzle size.", + "type": "bool", + "default_value": "false", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, "xy_offset": { "label": "Horizontal Expansion", From 73a99c5eba30d797a0af8be3d3f6b2878458eeaf Mon Sep 17 00:00:00 2001 From: 14bitVoid <14bitvoid@protonmail.com> Date: Sun, 9 Jul 2017 04:52:52 +0200 Subject: [PATCH 238/379] Update description of initial layer line width --- 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 ed83daf8d5..4856476991 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -828,7 +828,7 @@ "initial_layer_line_width_factor": { "label": "Initial Layer Line Width", - "description": "Factor of the line width on the first layer. Only applies to skin and walls.", + "description": "Multiplier of the line width on the first layer. Doesn't apply to brim, raft and skirt.", "type": "float", "unit": "%", "default_value": 100.0, From de0ac5ccff972832ba562d26030a38f751c3d20a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 11:28:14 +0200 Subject: [PATCH 239/379] Use CuraContainerStack API --- .../MachineSettingsAction.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 950c97a4e2..d937a8eba5 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -48,8 +48,8 @@ class MachineSettingsAction(MachineAction): def _onContainerRemoved(self, container): # Remove definition_changes containers when a stack is removed if container.getMetaDataEntry("type") in ["machine", "extruder_train"]: - definition_changes_container = container.findContainer({"type": "definition_changes"}) - if not definition_changes_container: + definition_changes_container = container.definitionChanges + if definition_changes_container.id == "empty": return self._container_registry.removeContainer(definition_changes_container.getId()) @@ -59,8 +59,8 @@ class MachineSettingsAction(MachineAction): return # Make sure there is a definition_changes container to store the machine settings - definition_changes_container = self._global_container_stack.findContainer({"type": "definition_changes"}) - if not definition_changes_container: + definition_changes_container = self._global_container_stack.definitionChanges + if definition_changes_container.id == "empty": definition_changes_container = self._createDefinitionChangesContainer(self._global_container_stack, self._global_container_stack.getName() + "_settings") # Notify the UI in which container to store the machine settings data @@ -85,8 +85,8 @@ class MachineSettingsAction(MachineAction): return # Make sure there is a definition_changes container to store the machine settings - definition_changes_container = extruder_container_stack.findContainer({"type": "definition_changes"}) - if not definition_changes_container: + definition_changes_container = extruder_container_stack.definitionChanges + if definition_changes_container.id == "empty": definition_changes_container = self._createDefinitionChangesContainer(extruder_container_stack, extruder_container_stack.getId() + "_settings") # Notify the UI in which container to store the machine settings data @@ -140,8 +140,8 @@ class MachineSettingsAction(MachineAction): machine_manager = Application.getInstance().getMachineManager() extruder_manager = ExtruderManager.getInstance() - definition_changes_container = self._global_container_stack.findContainer({"type": "definition_changes"}) - if not self._global_container_stack or not definition_changes_container: + definition_changes_container = self._global_container_stack.definitionChanges + if not self._global_container_stack or definition_changes_container.id == "empty": return previous_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") From a2332ae30463c3d7293b8f3db39c093d0cb4e2f4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 12:32:16 +0200 Subject: [PATCH 240/379] Add tooltips to most fields --- .../MachineSettingsAction.qml | 245 ++++++++++-------- 1 file changed, 136 insertions(+), 109 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 23dc7f073f..a984487ee3 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -148,67 +148,29 @@ Cura.MachineAction text: catalog.i18nc("@label", "Build Plate Shape") } - ComboBox + Loader { id: shapeComboBox - model: ListModel - { - id: shapesModel - Component.onCompleted: - { - // Options come in as a string-representation of an OrderedDict - var options = machineShapeProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/); - if(options) - { - options = options[1].split("), (") - for(var i = 0; i < options.length; i++) - { - var option = options[i].substring(1, options[i].length - 1).split("', '") - shapesModel.append({text: option[1], value: option[0]}); - } - } - } - } - currentIndex: - { - var currentValue = machineShapeProvider.properties.value; - var index = 0; - for(var i = 0; i < shapesModel.count; i++) - { - if(shapesModel.get(i).value == currentValue) { - index = i; - break; - } - } - return index - } - onActivated: - { - if(machineShapeProvider.properties.value != shapesModel.get(index).value) - { - machineShapeProvider.setPropertyValue("value", shapesModel.get(index).value); - manager.forceUpdate(); - } - } + sourceComponent: comboBoxWithOptions + property var propertyProvider: machineShapeProvider + property bool forceUpdateOnChange: true } } - CheckBox + Loader { id: centerIsZeroCheckBox - text: catalog.i18nc("@option:check", "Machine Center is Zero") - checked: String(machineCenterIsZeroProvider.properties.value).toLowerCase() != 'false' - onClicked: - { - machineCenterIsZeroProvider.setPropertyValue("value", checked); - manager.forceUpdate(); - } + sourceComponent: simpleCheckBox + property string label: catalog.i18nc("@option:check", "Machine Center is Zero") + property var propertyProvider: machineCenterIsZeroProvider + property bool forceUpdateOnChange: true } - CheckBox + Loader { id: heatedBedCheckBox - text: catalog.i18nc("@option:check", "Heated Bed") - checked: String(machineHeatedBedProvider.properties.value).toLowerCase() != 'false' - onClicked: machineHeatedBedProvider.setPropertyValue("value", checked) + sourceComponent: simpleCheckBox + property string label: catalog.i18nc("@option:check", "Heated Bed") + property var propertyProvider: machineHeatedBedProvider + property bool forceUpdateOnChange: true } } @@ -221,44 +183,13 @@ Cura.MachineAction text: catalog.i18nc("@label", "GCode Flavor") } - ComboBox + Loader { - model: ListModel - { - id: flavorModel - Component.onCompleted: - { - // Options come in as a string-representation of an OrderedDict - var options = machineGCodeFlavorProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/); - if(options) - { - options = options[1].split("), (") - for(var i = 0; i < options.length; i++) - { - var option = options[i].substring(1, options[i].length - 1).split("', '") - flavorModel.append({text: option[1], value: option[0]}); - } - } - } - } - currentIndex: - { - var currentValue = machineGCodeFlavorProvider.properties.value; - var index = 0; - for(var i = 0; i < flavorModel.count; i++) - { - if(flavorModel.get(i).value == currentValue) { - index = i; - break; - } - } - return index - } - onActivated: - { - machineGCodeFlavorProvider.setPropertyValue("value", flavorModel.get(index).value); - manager.updateHasMaterialsMetadata(); - } + id: gcodeFlavorComboBox + sourceComponent: comboBoxWithOptions + property var propertyProvider: machineGCodeFlavorProvider + property bool forceUpdateOnChange: true + property string afterOnActivate: "manager.updateHasMaterialsMetadata()" } } } @@ -647,12 +578,43 @@ Cura.MachineAction } } + Component + { + id: simpleCheckBox + UM.TooltipArea + { + height: checkBox.height + width: checkBox.width + text: propertyProvider.properties.description + + property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + + CheckBox + { + id: checkBox + text: label + checked: String(propertyProvider.properties.value).toLowerCase() != 'false' + onClicked: + { + propertyProvider.setPropertyValue("value", checked); + if(_forceUpdateOnChange) + { + manager.forceUpdate(); + } + } + + } + } + } + Component { id: numericTextFieldWithUnit - Item { + UM.TooltipArea + { height: textField.height width: textField.width + text: propertyProvider.properties.description property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange @@ -690,13 +652,78 @@ Cura.MachineAction } } + Component + { + id: comboBoxWithOptions + UM.TooltipArea + { + height: comboBox.height + width: comboBox.width + text: propertyProvider.properties.description + + property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + property string _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? "": afterOnActivate + + ComboBox + { + id: comboBox + model: ListModel + { + id: optionsModel + Component.onCompleted: + { + // Options come in as a string-representation of an OrderedDict + var options = propertyProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/); + if(options) + { + options = options[1].split("), (") + for(var i = 0; i < options.length; i++) + { + var option = options[i].substring(1, options[i].length - 1).split("', '") + optionsModel.append({text: option[1], value: option[0]}); + } + } + } + } + currentIndex: + { + var currentValue = propertyProvider.properties.value; + var index = 0; + for(var i = 0; i < optionsModel.count; i++) + { + if(optionsModel.get(i).value == currentValue) { + index = i; + break; + } + } + return index + } + onActivated: + { + if(propertyProvider.properties.value != optionsModel.get(index).value) + { + propertyProvider.setPropertyValue("value", optionsModel.get(index).value); + if(_forceUpdateOnChange) + { + manager.forceUpdate(); + } + if(_afterOnActivate != "") + { + eval(_afterOnActivate); + } + } + } + } + } + } + UM.SettingPropertyProvider { id: machineWidthProvider containerStackId: Cura.MachineManager.activeMachineId key: "machine_width" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -706,7 +733,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_depth" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -716,7 +743,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_height" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -726,7 +753,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_shape" - watchedProperties: [ "value", "options" ] + watchedProperties: [ "value", "options", "description" ] storeIndex: manager.containerIndex } @@ -736,7 +763,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_heated_bed" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -746,7 +773,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_center_is_zero" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -756,7 +783,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_gcode_flavor" - watchedProperties: [ "value", "options" ] + watchedProperties: [ "value", "options", "description" ] storeIndex: manager.containerIndex } @@ -766,7 +793,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "material_diameter" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -776,7 +803,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_nozzle_size" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -786,7 +813,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_extruder_count" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -796,7 +823,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "gantry_height" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -806,7 +833,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_head_with_fans_polygon" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -817,7 +844,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_start_gcode" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -827,7 +854,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_end_gcode" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -837,7 +864,7 @@ Cura.MachineAction containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" key: "machine_nozzle_size" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -847,7 +874,7 @@ Cura.MachineAction containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" key: "machine_nozzle_offset_x" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -857,7 +884,7 @@ Cura.MachineAction containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" key: "machine_nozzle_offset_y" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -867,7 +894,7 @@ Cura.MachineAction containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" key: "machine_extruder_start_code" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } @@ -877,7 +904,7 @@ Cura.MachineAction containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" key: "machine_extruder_end_code" - watchedProperties: [ "value" ] + watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } } \ No newline at end of file From 1eeb953072b20345bfc553ec6d2e5f24ff925a81 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 13:11:03 +0200 Subject: [PATCH 241/379] Restructure propertyProviders to be part of setting components --- .../MachineSettingsAction.qml | 223 +++++++----------- 1 file changed, 79 insertions(+), 144 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index a984487ee3..83a8b243a6 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -105,7 +105,7 @@ Cura.MachineAction { id: buildAreaWidthField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: machineWidthProvider + property string settingKey: "machine_width" property string unit: catalog.i18nc("@label", "mm") property bool forceUpdateOnChange: true } @@ -118,7 +118,7 @@ Cura.MachineAction { id: buildAreaDepthField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: machineDepthProvider + property string settingKey: "machine_depth" property string unit: catalog.i18nc("@label", "mm") property bool forceUpdateOnChange: true } @@ -131,7 +131,7 @@ Cura.MachineAction { id: buildAreaHeightField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: machineHeightProvider + property string settingKey: "machine_height" property string unit: catalog.i18nc("@label", "mm") property bool forceUpdateOnChange: true } @@ -152,7 +152,7 @@ Cura.MachineAction { id: shapeComboBox sourceComponent: comboBoxWithOptions - property var propertyProvider: machineShapeProvider + property string settingKey: "machine_shape" property bool forceUpdateOnChange: true } } @@ -161,7 +161,7 @@ Cura.MachineAction id: centerIsZeroCheckBox sourceComponent: simpleCheckBox property string label: catalog.i18nc("@option:check", "Machine Center is Zero") - property var propertyProvider: machineCenterIsZeroProvider + property string settingKey: "machine_center_is_zero" property bool forceUpdateOnChange: true } Loader @@ -169,7 +169,7 @@ Cura.MachineAction id: heatedBedCheckBox sourceComponent: simpleCheckBox property string label: catalog.i18nc("@option:check", "Heated Bed") - property var propertyProvider: machineHeatedBedProvider + property var settingKey: "machine_heated_bed" property bool forceUpdateOnChange: true } } @@ -187,7 +187,7 @@ Cura.MachineAction { id: gcodeFlavorComboBox sourceComponent: comboBoxWithOptions - property var propertyProvider: machineGCodeFlavorProvider + property string settingKey: "machine_gcode_flavor" property bool forceUpdateOnChange: true property string afterOnActivate: "manager.updateHasMaterialsMetadata()" } @@ -270,7 +270,7 @@ Cura.MachineAction { id: gantryHeightField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: gantryHeightProvider + property string settingKey: "gantry_height" property string unit: catalog.i18nc("@label", "mm") } @@ -313,7 +313,7 @@ Cura.MachineAction { id: materialDiameterField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: materialDiameterProvider + property string settingKey: "material_diameter" property string unit: catalog.i18nc("@label", "mm") } Label @@ -326,7 +326,7 @@ Cura.MachineAction id: nozzleSizeField visible: !Cura.MachineManager.hasVariants && machineExtruderCountProvider.properties.value == 1 sourceComponent: numericTextFieldWithUnit - property var propertyProvider: machineNozzleSizeProvider + property string settingKey: "machine_nozzle_size" property string unit: catalog.i18nc("@label", "mm") } } @@ -476,7 +476,8 @@ Cura.MachineAction id: extruderNozzleSizeField visible: !Cura.MachineManager.hasVariants sourceComponent: numericTextFieldWithUnit - property var propertyProvider: extruderNozzleSizeProvider + property string settingKey: "machine_nozzle_size" + property bool isExtruderSetting: true property string unit: catalog.i18nc("@label", "mm") } @@ -488,8 +489,9 @@ Cura.MachineAction { id: extruderOffsetXField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: extruderOffsetXProvider + property string settingKey: "machine_nozzle_offset_x" property string unit: catalog.i18nc("@label", "mm") + property bool isExtruderSetting: true property bool forceUpdateOnChange: true property bool allowNegative: true } @@ -501,8 +503,9 @@ Cura.MachineAction { id: extruderOffsetYField sourceComponent: numericTextFieldWithUnit - property var propertyProvider: extruderOffsetYProvider + property string settingKey: "machine_nozzle_offset_y" property string unit: catalog.i18nc("@label", "mm") + property bool isExtruderSetting: true property bool forceUpdateOnChange: true property bool allowNegative: true } @@ -587,8 +590,29 @@ Cura.MachineAction width: checkBox.width text: propertyProvider.properties.description + property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + UM.SettingPropertyProvider + { + id: propertyProvider + + containerStackId: { + if(_isExtruderSetting) + { + if(settingsTabs.currentIndex > 0) + { + return Cura.MachineManager.activeStackId; + } + return ""; + } + return Cura.MachineManager.activeMachineId; + } + key: settingKey + watchedProperties: [ "value", "description" ] + storeIndex: manager.containerIndex + } + CheckBox { id: checkBox @@ -602,7 +626,6 @@ Cura.MachineAction manager.forceUpdate(); } } - } } } @@ -616,9 +639,30 @@ Cura.MachineAction width: textField.width text: propertyProvider.properties.description + property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + UM.SettingPropertyProvider + { + id: propertyProvider + + containerStackId: { + if(_isExtruderSetting) + { + if(settingsTabs.currentIndex > 0) + { + return Cura.MachineManager.activeStackId; + } + return ""; + } + return Cura.MachineManager.activeMachineId; + } + key: settingKey + watchedProperties: [ "value", "description" ] + storeIndex: manager.containerIndex + } + TextField { id: textField @@ -661,9 +705,30 @@ Cura.MachineAction width: comboBox.width text: propertyProvider.properties.description + property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange property string _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? "": afterOnActivate + UM.SettingPropertyProvider + { + id: propertyProvider + + containerStackId: { + if(_isExtruderSetting) + { + if(settingsTabs.currentIndex > 0) + { + return Cura.MachineManager.activeStackId; + } + return ""; + } + return Cura.MachineManager.activeMachineId; + } + key: settingKey + watchedProperties: [ "value", "options", "description" ] + storeIndex: manager.containerIndex + } + ComboBox { id: comboBox @@ -717,96 +782,6 @@ Cura.MachineAction } } - UM.SettingPropertyProvider - { - id: machineWidthProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_width" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineDepthProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_depth" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineHeightProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_height" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineShapeProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_shape" - watchedProperties: [ "value", "options", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineHeatedBedProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_heated_bed" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineCenterIsZeroProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_center_is_zero" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineGCodeFlavorProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_gcode_flavor" - watchedProperties: [ "value", "options", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: materialDiameterProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "material_diameter" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineNozzleSizeProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_nozzle_size" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - UM.SettingPropertyProvider { id: machineExtruderCountProvider @@ -817,16 +792,6 @@ Cura.MachineAction storeIndex: manager.containerIndex } - UM.SettingPropertyProvider - { - id: gantryHeightProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "gantry_height" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - UM.SettingPropertyProvider { id: machineHeadPolygonProvider @@ -858,36 +823,6 @@ Cura.MachineAction storeIndex: manager.containerIndex } - UM.SettingPropertyProvider - { - id: extruderNozzleSizeProvider - - containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" - key: "machine_nozzle_size" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: extruderOffsetXProvider - - containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" - key: "machine_nozzle_offset_x" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: extruderOffsetYProvider - - containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" - key: "machine_nozzle_offset_y" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - UM.SettingPropertyProvider { id: extruderStartGcodeProvider From 4705ada6efcd7d52a4c69255b52caa8679c0e151 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 13:35:50 +0200 Subject: [PATCH 242/379] Add tooltip to gcode areas --- .../MachineSettingsAction.qml | 183 ++++++++---------- 1 file changed, 77 insertions(+), 106 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 83a8b243a6..beada89c3c 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -348,24 +348,13 @@ Cura.MachineAction text: catalog.i18nc("@label", "Start Gcode") font.bold: true } - TextArea + Loader { id: machineStartGcodeField - width: parent.width - height: parent.height - y - font: UM.Theme.getFont("fixed") - text: machineStartGcodeProvider.properties.value - onActiveFocusChanged: - { - if(!activeFocus) - { - machineStartGcodeProvider.setPropertyValue("value", machineStartGcodeField.text) - } - } - Component.onCompleted: - { - wrapMode = TextEdit.NoWrap; - } + sourceComponent: gcodeTextArea + property int areaWidth: parent.width + property int areaHeight: parent.height - y + property string settingKey: "machine_start_gcode" } } @@ -377,24 +366,13 @@ Cura.MachineAction text: catalog.i18nc("@label", "End Gcode") font.bold: true } - TextArea + Loader { id: machineEndGcodeField - width: parent.width - height: parent.height - y - font: UM.Theme.getFont("fixed") - text: machineEndGcodeProvider.properties.value - onActiveFocusChanged: - { - if(!activeFocus) - { - machineEndGcodeProvider.setPropertyValue("value", machineEndGcodeField.text) - } - } - Component.onCompleted: - { - wrapMode = TextEdit.NoWrap; - } + sourceComponent: gcodeTextArea + property int areaWidth: parent.width + property int areaHeight: parent.height - y + property string settingKey: "machine_end_gcode" } } } @@ -526,25 +504,15 @@ Cura.MachineAction text: catalog.i18nc("@label", "Extruder Start Gcode") font.bold: true } - TextArea + Loader { id: extruderStartGcodeField - width: parent.width - height: parent.height - y - font: UM.Theme.getFont("fixed") - text: (extruderStartGcodeProvider.properties.value) ? extruderStartGcodeProvider.properties.value : "" - onActiveFocusChanged: - { - if(!activeFocus) - { - extruderStartGcodeProvider.setPropertyValue("value", extruderStartGcodeField.text) - } - } - Component.onCompleted: - { - wrapMode = TextEdit.NoWrap; - } - } + sourceComponent: gcodeTextArea + property int areaWidth: parent.width + property int areaHeight: parent.height - y + property string settingKey: "machine_extruder_start_code" + property bool isExtruderSetting: true + } } Column { height: parent.height @@ -554,24 +522,14 @@ Cura.MachineAction text: catalog.i18nc("@label", "Extruder End Gcode") font.bold: true } - TextArea + Loader { id: extruderEndGcodeField - width: parent.width - height: parent.height - y - font: UM.Theme.getFont("fixed") - text: (extruderEndGcodeProvider.properties.value) ? extruderEndGcodeProvider.properties.value : "" - onActiveFocusChanged: - { - if(!activeFocus) - { - extruderEndGcodeProvider.setPropertyValue("value", extruderEndGcodeField.text) - } - } - Component.onCompleted: - { - wrapMode = TextEdit.NoWrap; - } + sourceComponent: gcodeTextArea + property int areaWidth: parent.width + property int areaHeight: parent.height - y + property string settingKey: "machine_extruder_end_code" + property bool isExtruderSetting: true } } } @@ -782,6 +740,60 @@ Cura.MachineAction } } + Component + { + id: gcodeTextArea + + UM.TooltipArea + { + height: gcodeArea.height + width: gcodeArea.width + text: propertyProvider.properties.description + + property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting + + UM.SettingPropertyProvider + { + id: propertyProvider + + containerStackId: { + if(_isExtruderSetting) + { + if(settingsTabs.currentIndex > 0) + { + return Cura.MachineManager.activeStackId; + } + return ""; + } + return Cura.MachineManager.activeMachineId; + } + key: settingKey + watchedProperties: [ "value", "description" ] + storeIndex: manager.containerIndex + } + + TextArea + { + id: gcodeArea + width: areaWidth + height: areaHeight + font: UM.Theme.getFont("fixed") + text: (propertyProvider.properties.value) ? propertyProvider.properties.value : "" + onActiveFocusChanged: + { + if(!activeFocus) + { + propertyProvider.setPropertyValue("value", gcodeField.text) + } + } + Component.onCompleted: + { + wrapMode = TextEdit.NoWrap; + } + } + } + } + UM.SettingPropertyProvider { id: machineExtruderCountProvider @@ -801,45 +813,4 @@ Cura.MachineAction watchedProperties: [ "value", "description" ] storeIndex: manager.containerIndex } - - - UM.SettingPropertyProvider - { - id: machineStartGcodeProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_start_gcode" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineEndGcodeProvider - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_end_gcode" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: extruderStartGcodeProvider - - containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" - key: "machine_extruder_start_code" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: extruderEndGcodeProvider - - containerStackId: settingsTabs.currentIndex > 0 ? Cura.MachineManager.activeStackId : "" - key: "machine_extruder_end_code" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } } \ No newline at end of file From cb7b845a32cecda590d2569f97bbed8ab631e68c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 14:39:55 +0200 Subject: [PATCH 243/379] Add tooltips to the head polygon fields --- .../MachineSettingsAction.qml | 135 ++++++++++++------ 1 file changed, 89 insertions(+), 46 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index beada89c3c..09d99afaad 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -215,48 +215,52 @@ Cura.MachineAction { text: catalog.i18nc("@label", "X min") } - TextField + Loader { id: printheadXMinField - text: getHeadPolygonCoord("x", "min") - validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } - onEditingFinished: setHeadPolygon() + sourceComponent: headPolygonTextField + property string axis: "x" + property string side: "min" + property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") } Label { text: catalog.i18nc("@label", "Y min") } - TextField + Loader { id: printheadYMinField - text: getHeadPolygonCoord("y", "min") - validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } - onEditingFinished: setHeadPolygon() + sourceComponent: headPolygonTextField + property string axis: "y" + property string side: "min" + property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") } Label { text: catalog.i18nc("@label", "X max") } - TextField + Loader { id: printheadXMaxField - text: getHeadPolygonCoord("x", "max") - validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } - onEditingFinished: setHeadPolygon() + sourceComponent: headPolygonTextField + property string axis: "x" + property string side: "max" + property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") } Label { text: catalog.i18nc("@label", "Y max") } - TextField + Loader { id: printheadYMaxField - text: getHeadPolygonCoord("y", "max") - validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } - onEditingFinished: setHeadPolygon() + sourceComponent: headPolygonTextField + property string axis: "y" + property string side: "max" + property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") } Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } @@ -376,36 +380,6 @@ Cura.MachineAction } } } - - function getHeadPolygonCoord(axis, minMax) - { - var polygon = JSON.parse(machineHeadPolygonProvider.properties.value); - var item = (axis == "x") ? 0 : 1 - var result = polygon[0][item]; - for(var i = 1; i < polygon.length; i++) { - if (minMax == "min") { - result = Math.min(result, polygon[i][item]); - } else { - result = Math.max(result, polygon[i][item]); - } - } - return Math.abs(result); - } - - function setHeadPolygon() - { - var polygon = []; - polygon.push([-parseFloat(printheadXMinField.text), parseFloat(printheadYMaxField.text)]); - polygon.push([-parseFloat(printheadXMinField.text),-parseFloat(printheadYMinField.text)]); - polygon.push([ parseFloat(printheadXMaxField.text), parseFloat(printheadYMaxField.text)]); - polygon.push([ parseFloat(printheadXMaxField.text),-parseFloat(printheadYMinField.text)]); - var polygon_string = JSON.stringify(polygon); - if(polygon != machineHeadPolygonProvider.properties.value) - { - machineHeadPolygonProvider.setPropertyValue("value", polygon_string); - manager.forceUpdate(); - } - } } } @@ -794,6 +768,75 @@ Cura.MachineAction } } + Component + { + id: headPolygonTextField + UM.TooltipArea + { + height: textField.height + width: textField.width + text: tooltip + + TextField + { + id: textField + text: + { + var polygon = JSON.parse(machineHeadPolygonProvider.properties.value); + var item = (axis == "x") ? 0 : 1 + var result = polygon[0][item]; + for(var i = 1; i < polygon.length; i++) { + if (side == "min") { + result = Math.min(result, polygon[i][item]); + } else { + result = Math.max(result, polygon[i][item]); + } + } + result = Math.abs(result); + printHeadPolygon[axis][side] = result; + return result; + } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } + onEditingFinished: + { + printHeadPolygon[axis][side] = parseFloat(textField.text); + var polygon = []; + polygon.push([-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]]); + polygon.push([-printHeadPolygon["x"]["min"],-printHeadPolygon["y"]["min"]]); + polygon.push([ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]]); + polygon.push([ printHeadPolygon["x"]["max"],-printHeadPolygon["y"]["mìn"]]); + var polygon_string = JSON.stringify(polygon); + if(polygon_string != machineHeadPolygonProvider.properties.value) + { + machineHeadPolygonProvider.setPropertyValue("value", polygon_string); + manager.forceUpdate(); + } + } + } + + Label + { + text: catalog.i18nc("@label", "mm") + anchors.right: textField.right + anchors.rightMargin: y - textField.y + anchors.verticalCenter: textField.verticalCenter + } + } + } + + property var printHeadPolygon: + { + "x": { + "min": 0, + "max": 0, + }, + "y": { + "min": 0, + "max": 0, + }, + } + + UM.SettingPropertyProvider { id: machineExtruderCountProvider From b8ea762242054c0496349172c15d2fe123851b68 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 14:57:51 +0200 Subject: [PATCH 244/379] Override some tooltips for clarity in the context of Machine Settings --- .../MachineSettingsAction.qml | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 09d99afaad..adccfd5eb4 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -221,7 +221,7 @@ Cura.MachineAction sourceComponent: headPolygonTextField property string axis: "x" property string side: "min" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") } Label @@ -234,7 +234,7 @@ Cura.MachineAction sourceComponent: headPolygonTextField property string axis: "y" property string side: "min" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") } Label @@ -247,7 +247,7 @@ Cura.MachineAction sourceComponent: headPolygonTextField property string axis: "x" property string side: "max" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") } Label @@ -260,7 +260,7 @@ Cura.MachineAction sourceComponent: headPolygonTextField property string axis: "y" property string side: "max" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between the print and the printhead.") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") } Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } @@ -276,6 +276,7 @@ Cura.MachineAction sourceComponent: numericTextFieldWithUnit property string settingKey: "gantry_height" property string unit: catalog.i18nc("@label", "mm") + property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".") } Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } @@ -319,6 +320,7 @@ Cura.MachineAction sourceComponent: numericTextFieldWithUnit property string settingKey: "material_diameter" property string unit: catalog.i18nc("@label", "mm") + property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer.") } Label { @@ -359,6 +361,7 @@ Cura.MachineAction property int areaWidth: parent.width property int areaHeight: parent.height - y property string settingKey: "machine_start_gcode" + property string tooltip: catalog.i18nc("@tooltip", "Gcode commands to be executed at the very start.") } } @@ -377,6 +380,7 @@ Cura.MachineAction property int areaWidth: parent.width property int areaHeight: parent.height - y property string settingKey: "machine_end_gcode" + property string tooltip: catalog.i18nc("@tooltip", "Gcode commands to be executed at the very end.") } } } @@ -520,10 +524,11 @@ Cura.MachineAction { height: checkBox.height width: checkBox.width - text: propertyProvider.properties.description + text: _tooltip property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider { @@ -569,11 +574,12 @@ Cura.MachineAction { height: textField.height width: textField.width - text: propertyProvider.properties.description + text: _tooltip property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider { @@ -635,11 +641,12 @@ Cura.MachineAction { height: comboBox.height width: comboBox.width - text: propertyProvider.properties.description + text: _tooltip property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange property string _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? "": afterOnActivate + property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider { @@ -722,9 +729,10 @@ Cura.MachineAction { height: gcodeArea.height width: gcodeArea.width - text: propertyProvider.properties.description + text: _tooltip property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting + property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider { From ddc94e9beca1d42b9e19849f957b6bd142700f87 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 15:44:01 +0200 Subject: [PATCH 245/379] Improve readability --- .../MachineSettingsAction.py | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index d937a8eba5..54737c8828 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -250,30 +250,33 @@ class MachineSettingsAction(MachineAction): return definition = self._global_container_stack.getBottom() - if definition.getProperty("machine_gcode_flavor", "value") == "UltiGCode" and not definition.getMetaDataEntry("has_materials", False): - has_materials = self._global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode" + if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry("has_materials", False): + # In other words: only continue for the UM2 (extended), but not for the UM2+ + return - material_container = self._global_container_stack.material - material_index = self._global_container_stack.getContainerIndex(material_container) + has_materials = self._global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode" - if has_materials: - if "has_materials" in self._global_container_stack.getMetaData(): - self._global_container_stack.setMetaDataEntry("has_materials", True) - else: - self._global_container_stack.addMetaDataEntry("has_materials", True) + material_container = self._global_container_stack.material + material_index = self._global_container_stack.getContainerIndex(material_container) - # Set the material container to a sane default - if material_container.getId() == "empty_material": - search_criteria = { "type": "material", "definition": "fdmprinter", "id": "*pla*"} - containers = self._container_registry.findInstanceContainers(**search_criteria) - if containers: - self._global_container_stack.replaceContainer(material_index, containers[0]) + if has_materials: + if "has_materials" in self._global_container_stack.getMetaData(): + self._global_container_stack.setMetaDataEntry("has_materials", True) else: - # The metadata entry is stored in an ini, and ini files are parsed as strings only. - # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. - if "has_materials" in self._global_container_stack.getMetaData(): - self._global_container_stack.removeMetaDataEntry("has_materials") + self._global_container_stack.addMetaDataEntry("has_materials", True) - self._global_container_stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() + # Set the material container to a sane default + if material_container.getId() == "empty_material": + search_criteria = { "type": "material", "definition": "fdmprinter", "id": "*pla*"} + containers = self._container_registry.findInstanceContainers(**search_criteria) + if containers: + self._global_container_stack.replaceContainer(material_index, containers[0]) + else: + # The metadata entry is stored in an ini, and ini files are parsed as strings only. + # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. + if "has_materials" in self._global_container_stack.getMetaData(): + self._global_container_stack.removeMetaDataEntry("has_materials") - Application.getInstance().globalContainerStackChanged.emit() + self._global_container_stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() + + Application.getInstance().globalContainerStackChanged.emit() From 8c2f55661601a3facfcca33cf5c4a6653a2455b6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 16:41:24 +0200 Subject: [PATCH 246/379] Switch to an appropriate material when changing the material diameter If we don't do this, the material will always override the setting in Machine Settings --- .../MachineSettingsAction.py | 83 +++++++++++++++++++ .../MachineSettingsAction.qml | 8 +- 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 54737c8828..6844e5cff7 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -280,3 +280,86 @@ class MachineSettingsAction(MachineAction): self._global_container_stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() Application.getInstance().globalContainerStackChanged.emit() + + @pyqtSlot() + def updateMaterialForDiameter(self): + # Updates the material container to a material that matches the material diameter set for the printer + if not self._global_container_stack: + return + + if not self._global_container_stack.getMetaDataEntry("has_materials", False): + return + + machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") + if machine_extruder_count > 1: + material = ExtruderManager.getInstance().getActiveExtruderStack().material + else: + material = self._global_container_stack.material + material_diameter = material.getProperty("material_diameter", "value") + if not material_diameter: # in case of "empty" material + material_diameter = 0 + material_approximate_diameter = str(round(material_diameter)) + + definition_changes = self._global_container_stack.definitionChanges + machine_diameter = definition_changes.getProperty("material_diameter", "value") + if not machine_diameter: + machine_diameter = self._global_container_stack.definition.getProperty("material_diameter", "value") + machine_approximate_diameter = str(round(machine_diameter)) + + if material_approximate_diameter != machine_approximate_diameter: + Logger.log("i", "The the currently active material(s) do not match the diameter set for the printer. Finding alternatives.") + + if machine_extruder_count > 1: + stacks = ExtruderManager.getInstance().getExtruderStacks() + else: + stacks = [self._global_container_stack] + + if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): + materials_definition = self._global_container_stack.definition.getId() + has_material_variants = self._global_container_stack.getMetaDataEntry("has_variants", False) + else: + materials_definition = "fdmprinter" + has_material_variants = False + + for stack in stacks: + old_material = stack.material + search_criteria = { + "type": "material", + "approximate_diameter": machine_approximate_diameter, + "material": old_material.getMetaDataEntry("material", "value"), + "supplier": old_material.getMetaDataEntry("supplier", "value"), + "color_name": old_material.getMetaDataEntry("color_name", "value"), + "definition": materials_definition + } + if has_material_variants: + search_criteria["variant"] = stack.variant.getId() + + if old_material.getId() == "empty": + search_criteria.pop("material", None) + search_criteria.pop("supplier", None) + search_criteria.pop("definition", None) + search_criteria["id"] = stack.getMetaDataEntry("preferred_material") + + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Same material with new diameter is not found, search for generic version of the same material type + search_criteria.pop("supplier", None) + search_criteria["color_name"] = "Generic" + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Generic material with new diameter is not found, search for preferred material + search_criteria.pop("color_name", None) + search_criteria.pop("material", None) + search_criteria["id"] = stack.getMetaDataEntry("preferred_material") + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Preferrd material with new diameter is not found, search for any material + search_criteria.pop("id", None) + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Just use empty material as a final fallback + materials = [ContainerRegistry.getInstance().getEmptyInstanceContainer()] + + Logger.log("i", "Selecting new material: %s" % materials[0].getId()) + + stack.material = materials[0] diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index adccfd5eb4..40b15f29a9 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -320,7 +320,8 @@ Cura.MachineAction sourceComponent: numericTextFieldWithUnit property string settingKey: "material_diameter" property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer.") + property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") + property string afterOnEditingFinished: "manager.updateMaterialForDiameter()" } Label { @@ -578,6 +579,7 @@ Cura.MachineAction property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative + property string _afterOnEditingFinished: (typeof(afterOnEditingFinished) === 'undefined') ? "": afterOnEditingFinished property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip @@ -620,6 +622,10 @@ Cura.MachineAction ExtruderManager.setActiveExtruderIndex(extruderIndex) } } + if(_afterOnEditingFinished != "") + { + eval(_afterOnEditingFinished); + } } } } From d6ddf15e243f92018fac1953c2b806cdcac1703a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 9 Jul 2017 16:46:25 +0200 Subject: [PATCH 247/379] Fix selecting material for UM2 when switching from UltiGcode --- .../MachineSettingsAction/MachineSettingsAction.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 6844e5cff7..d15c4ab5e0 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -257,7 +257,6 @@ class MachineSettingsAction(MachineAction): has_materials = self._global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode" material_container = self._global_container_stack.material - material_index = self._global_container_stack.getContainerIndex(material_container) if has_materials: if "has_materials" in self._global_container_stack.getMetaData(): @@ -266,11 +265,11 @@ class MachineSettingsAction(MachineAction): self._global_container_stack.addMetaDataEntry("has_materials", True) # Set the material container to a sane default - if material_container.getId() == "empty_material": - search_criteria = { "type": "material", "definition": "fdmprinter", "id": "*pla*"} - containers = self._container_registry.findInstanceContainers(**search_criteria) - if containers: - self._global_container_stack.replaceContainer(material_index, containers[0]) + if material_container.getId() == "empty": + search_criteria = { "type": "material", "definition": "fdmprinter", "id": self._global_container_stack.getMetaDataEntry("preferred_material")} + materials = self._container_registry.findInstanceContainers(**search_criteria) + if materials: + self._global_container_stack.material = materials[0] else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. From 81e07b153071edb783d33f799785125cf58d6cf1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 10:35:03 +0200 Subject: [PATCH 248/379] Use stack properties instead of .findContainer(type = ...) Recently we changed the empty containers such that there is only one empty container instance and it doesn't have the proper type any more. Instead we have properties on the stack that allows us to find the container with the proper type. It's faster and easier to use. We've had a few bugs about this so I decided to update all of them to remove those for the future, except the ones in plugins/MachineSettingsAction/MachineSettingsAction.py because we have a pending pull request that fixes those. Fixing them would give merge conflicts for fieldOfView. It doesn't really belong to CURA-4024 but I'm sticking it under that nomer anyway to get it reviewed. --- cura/Settings/CuraContainerRegistry.py | 6 ++---- cura/Settings/MachineManager.py | 14 ++++++-------- cura/Settings/ProfilesModel.py | 4 ++-- .../UltimakerMachineActions/UMOUpgradeSelection.py | 2 +- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a67b502b4a..ed63e10909 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -340,10 +340,8 @@ class CuraContainerRegistry(ContainerRegistry): # \return the ID of the active material or the empty string def _activeMaterialId(self): global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack: - material = global_container_stack.findContainer({"type": "material"}) - if material: - return material.getId() + if global_container_stack and global_container_stack.material: + return global_container_stack.material.getId() return "" ## Returns true if the current machien requires its own quality profiles diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 61fec50992..6499e527f5 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -157,7 +157,7 @@ class MachineManager(QObject): if str(index) == extruder.getMetaDataEntry("position"): matching_extruder = extruder break - if matching_extruder and matching_extruder.findContainer({"type": "variant"}).getName() != hotend_id: + if matching_extruder and matching_extruder.variant.getName() != hotend_id: # Save the material that needs to be changed. Multiple changes will be handled by the callback. self._auto_hotends_changed[str(index)] = containers[0].getId() self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) @@ -181,11 +181,10 @@ class MachineManager(QObject): matching_extruder = extruder break - if matching_extruder and matching_extruder.findContainer({"type": "material"}).getMetaDataEntry("GUID") != material_id: + if matching_extruder and matching_extruder.material.getMetaDataEntry("GUID") != material_id: # Save the material that needs to be changed. Multiple changes will be handled by the callback. - variant_container = matching_extruder.findContainer({"type": "variant"}) - if self._global_container_stack.getBottom().getMetaDataEntry("has_variants") and variant_container: - variant_id = self.getQualityVariantId(self._global_container_stack.getBottom(), variant_container) + if self._global_container_stack.getBottom().getMetaDataEntry("has_variants") and matching_extruder.variant: + variant_id = self.getQualityVariantId(self._global_container_stack.getBottom(), matching_extruder.variant) for container in containers: if container.getMetaDataEntry("variant") == variant_id: self._auto_materials_changed[str(index)] = container.getId() @@ -507,9 +506,8 @@ class MachineManager(QObject): result = [] if ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() is not None: for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): - variant_container = stack.findContainer({"type": "variant"}) - if variant_container and variant_container != self._empty_variant_container: - result.append(variant_container.getId()) + if stack.variant and stack.variant != self._empty_variant_container: + result.append(stack.variant.getId()) return result diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 9056273216..18acb5e9e8 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -107,9 +107,9 @@ class ProfilesModel(InstanceContainersModel): continue #Quality has no value for layer height either. Get the layer height from somewhere lower in the stack. - skip_until_container = global_container_stack.findContainer({"type": "material"}) + skip_until_container = global_container_stack.material if not skip_until_container: #No material in stack. - skip_until_container = global_container_stack.findContainer({"type": "variant"}) + skip_until_container = global_container_stack.variant if not skip_until_container: #No variant in stack. skip_until_container = global_container_stack.getBottom() item["layer_height"] = str(global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId())) + unit #Fall through to the currently loaded material. diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py index 70a9d3fa0e..476089e533 100644 --- a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py @@ -36,7 +36,7 @@ class UMOUpgradeSelection(MachineAction): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: # Make sure there is a definition_changes container to store the machine settings - definition_changes_container = global_container_stack.findContainer({"type": "definition_changes"}) + definition_changes_container = global_container_stack.definition_changes if not definition_changes_container: definition_changes_container = self._createDefinitionChangesContainer(global_container_stack) From f0d327c0d0678be0bcab28f8bff7aae7433eeeb6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 11:22:35 +0200 Subject: [PATCH 249/379] Set setting_version properly on new stacks so you don't need to upgrade I don't think stacks had a setting_version property previously. Contributes to issue CURA-4024. --- cura/Settings/CuraContainerStack.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index fc90e3b239..75f3034362 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -8,6 +8,7 @@ from typing import Any, Optional from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject from UM.FlameProfiler import pyqtSlot +import cura.CuraApplication #To get the setting version. from UM.Decorators import override from UM.Logger import Logger from UM.Settings.ContainerStack import ContainerStack, InvalidContainerStackError @@ -47,6 +48,8 @@ class CuraContainerStack(ContainerStack): self.containersChanged.connect(self._onContainersChanged) + self.addMetaDataEntry("setting_version", cura.CuraApplication.CuraApplication.SettingVersion) + # This is emitted whenever the containersChanged signal from the ContainerStack base class is emitted. pyqtContainersChanged = pyqtSignal() From 9bfe18393fa699ae7a7203c82ff6efca783f8fce Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 11:45:03 +0200 Subject: [PATCH 250/379] Make sure the preferences file doesn't always get upgraded When the setting is equal to the default the setting_version won't get written to the preferences file. In that case the version upgrade system assumes that the setting_version was 0 or 1 and upgrades it. This makes sure that the setting is never equal to the default so that it always gets written. Found while working on CURA-4024. --- cura/CuraApplication.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 048973c5c4..418b3c0e9b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -268,7 +268,8 @@ class CuraApplication(QtApplication): ContainerRegistry.getInstance().load() # set the setting version for Preferences - Preferences.getInstance().addPreference("metadata/setting_version", CuraApplication.SettingVersion) + Preferences.getInstance().addPreference("metadata/setting_version", 0) + Preferences.getInstance().setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file. Preferences.getInstance().addPreference("cura/active_mode", "simple") From 8822307e026d659412a7dd6e9e4a32a323e4d7cf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 11:54:27 +0200 Subject: [PATCH 251/379] Cache preferences instance during start-up Perhaps a bit faster and less code duplication. Contributes to issue CURA-4024. --- cura/CuraApplication.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 418b3c0e9b..211c98782e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -268,36 +268,37 @@ class CuraApplication(QtApplication): ContainerRegistry.getInstance().load() # set the setting version for Preferences - Preferences.getInstance().addPreference("metadata/setting_version", 0) - Preferences.getInstance().setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file. + preferences = Preferences.getInstance() + preferences.addPreference("metadata/setting_version", 0) + preferences.setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file. - Preferences.getInstance().addPreference("cura/active_mode", "simple") + preferences.addPreference("cura/active_mode", "simple") - Preferences.getInstance().addPreference("cura/categories_expanded", "") - Preferences.getInstance().addPreference("cura/jobname_prefix", True) - Preferences.getInstance().addPreference("view/center_on_select", True) - Preferences.getInstance().addPreference("mesh/scale_to_fit", False) - Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) - Preferences.getInstance().addPreference("cura/dialog_on_project_save", True) - Preferences.getInstance().addPreference("cura/asked_dialog_on_project_save", False) - Preferences.getInstance().addPreference("cura/choice_on_profile_override", "always_ask") - Preferences.getInstance().addPreference("cura/choice_on_open_project", "always_ask") + preferences.addPreference("cura/categories_expanded", "") + preferences.addPreference("cura/jobname_prefix", True) + preferences.addPreference("view/center_on_select", True) + preferences.addPreference("mesh/scale_to_fit", False) + preferences.addPreference("mesh/scale_tiny_meshes", True) + preferences.addPreference("cura/dialog_on_project_save", True) + preferences.addPreference("cura/asked_dialog_on_project_save", False) + preferences.addPreference("cura/choice_on_profile_override", "always_ask") + preferences.addPreference("cura/choice_on_open_project", "always_ask") - Preferences.getInstance().addPreference("cura/currency", "€") - Preferences.getInstance().addPreference("cura/material_settings", "{}") + preferences.addPreference("cura/currency", "€") + preferences.addPreference("cura/material_settings", "{}") - Preferences.getInstance().addPreference("view/invert_zoom", False) + preferences.addPreference("view/invert_zoom", False) for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", "dialog_material_path"]: - Preferences.getInstance().addPreference("local_file/%s" % key, os.path.expanduser("~/")) + preferences.addPreference("local_file/%s" % key, os.path.expanduser("~/")) - Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") + preferences.setDefault("local_file/last_used_type", "text/x-gcode") - Preferences.getInstance().setDefault("general/visible_settings", """ + preferences.setDefault("general/visible_settings", """ machine_settings resolution layer_height From 7fe674bc5b7f90a8ab39178b1384e2893a2c8e98 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 10 Jul 2017 12:18:55 +0200 Subject: [PATCH 252/379] Improve test for empty containers --- .../MachineSettingsAction.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index d15c4ab5e0..951282a313 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -38,6 +38,8 @@ class MachineSettingsAction(MachineAction): Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderStackChanged) + self._empty_container = self._container_registry.getEmptyInstanceContainer() + self._backend = Application.getInstance().getBackend() def _onContainerAdded(self, container): @@ -49,7 +51,7 @@ class MachineSettingsAction(MachineAction): # Remove definition_changes containers when a stack is removed if container.getMetaDataEntry("type") in ["machine", "extruder_train"]: definition_changes_container = container.definitionChanges - if definition_changes_container.id == "empty": + if definition_changes_container == self._empty_container: return self._container_registry.removeContainer(definition_changes_container.getId()) @@ -60,7 +62,7 @@ class MachineSettingsAction(MachineAction): # Make sure there is a definition_changes container to store the machine settings definition_changes_container = self._global_container_stack.definitionChanges - if definition_changes_container.id == "empty": + if definition_changes_container == self._empty_container: definition_changes_container = self._createDefinitionChangesContainer(self._global_container_stack, self._global_container_stack.getName() + "_settings") # Notify the UI in which container to store the machine settings data @@ -86,7 +88,7 @@ class MachineSettingsAction(MachineAction): # Make sure there is a definition_changes container to store the machine settings definition_changes_container = extruder_container_stack.definitionChanges - if definition_changes_container.id == "empty": + if definition_changes_container == self._empty_container: definition_changes_container = self._createDefinitionChangesContainer(extruder_container_stack, extruder_container_stack.getId() + "_settings") # Notify the UI in which container to store the machine settings data @@ -141,7 +143,7 @@ class MachineSettingsAction(MachineAction): extruder_manager = ExtruderManager.getInstance() definition_changes_container = self._global_container_stack.definitionChanges - if not self._global_container_stack or definition_changes_container.id == "empty": + if not self._global_container_stack or definition_changes_container == self._empty_container: return previous_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") @@ -265,7 +267,7 @@ class MachineSettingsAction(MachineAction): self._global_container_stack.addMetaDataEntry("has_materials", True) # Set the material container to a sane default - if material_container.getId() == "empty": + if material_container == self._empty_container: search_criteria = { "type": "material", "definition": "fdmprinter", "id": self._global_container_stack.getMetaDataEntry("preferred_material")} materials = self._container_registry.findInstanceContainers(**search_criteria) if materials: @@ -333,7 +335,7 @@ class MachineSettingsAction(MachineAction): if has_material_variants: search_criteria["variant"] = stack.variant.getId() - if old_material.getId() == "empty": + if old_material == self._empty_container: search_criteria.pop("material", None) search_criteria.pop("supplier", None) search_criteria.pop("definition", None) @@ -357,7 +359,7 @@ class MachineSettingsAction(MachineAction): materials = self._container_registry.findInstanceContainers(**search_criteria) if not materials: # Just use empty material as a final fallback - materials = [ContainerRegistry.getInstance().getEmptyInstanceContainer()] + materials = [self._empty_container] Logger.log("i", "Selecting new material: %s" % materials[0].getId()) From e2c978f88b99d365cb2485004a7e94c1b0516bfd Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 10 Jul 2017 12:23:27 +0200 Subject: [PATCH 253/379] Remove unused extruderContainerIndex property Since the work on CuraContainerStack, the definition changes container for the extruder and for the global stack are always on the same index --- .../MachineSettingsAction/MachineSettingsAction.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 951282a313..5c6df6defe 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -30,7 +30,6 @@ class MachineSettingsAction(MachineAction): self._global_container_stack = None self._container_index = 0 - self._extruder_container_index = 0 self._container_registry = ContainerRegistry.getInstance() self._container_registry.containerAdded.connect(self._onContainerAdded) @@ -91,12 +90,6 @@ class MachineSettingsAction(MachineAction): if definition_changes_container == self._empty_container: definition_changes_container = self._createDefinitionChangesContainer(extruder_container_stack, extruder_container_stack.getId() + "_settings") - # Notify the UI in which container to store the machine settings data - container_index = extruder_container_stack.getContainerIndex(definition_changes_container) - if container_index != self._extruder_container_index: - self._extruder_container_index = container_index - self.extruderContainerIndexChanged.emit() - def _createDefinitionChangesContainer(self, container_stack, container_name, container_index = None): definition_changes_container = InstanceContainer(container_name) definition = container_stack.getBottom() @@ -115,13 +108,6 @@ class MachineSettingsAction(MachineAction): def containerIndex(self): return self._container_index - extruderContainerIndexChanged = pyqtSignal() - - @pyqtProperty(int, notify = extruderContainerIndexChanged) - def extruderContainerIndex(self): - return self._extruder_container_index - - def _onGlobalContainerChanged(self): self._global_container_stack = Application.getInstance().getGlobalContainerStack() From 79e38407c8a0682eabb3650c0e24a1ffac690526 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 10 Jul 2017 12:34:39 +0200 Subject: [PATCH 254/379] Add tooltip to "Number of Extruders" control --- .../MachineSettingsAction.qml | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 40b15f29a9..c531cee31a 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -285,28 +285,36 @@ Cura.MachineAction Label { text: catalog.i18nc("@label", "Number of Extruders") - visible: extruderCountComboBox.visible + visible: extruderCountControl.visible } - ComboBox + UM.TooltipArea { - id: extruderCountComboBox + id: extruderCountControl visible: manager.definedExtruderCount > 1 - model: ListModel + height: extruderCountComboBox.height + width: extruderCountComboBox.width + text: machineExtruderCountProvider.properties.description + + ComboBox { - id: extruderCountModel - Component.onCompleted: + id: extruderCountComboBox + model: ListModel { - for(var i = 0; i < manager.definedExtruderCount; i++) + id: extruderCountModel + Component.onCompleted: { - extruderCountModel.append({text: String(i + 1), value: i}); + for(var i = 0; i < manager.definedExtruderCount; i++) + { + extruderCountModel.append({text: String(i + 1), value: i}); + } } } - } - currentIndex: machineExtruderCountProvider.properties.value - 1 - onActivated: - { - manager.setMachineExtruderCount(index + 1); + currentIndex: machineExtruderCountProvider.properties.value - 1 + onActivated: + { + manager.setMachineExtruderCount(index + 1); + } } } @@ -867,7 +875,7 @@ Cura.MachineAction containerStackId: Cura.MachineManager.activeMachineId key: "machine_head_with_fans_polygon" - watchedProperties: [ "value", "description" ] + watchedProperties: [ "value" ] storeIndex: manager.containerIndex } } \ No newline at end of file From 6d2b46244f910cc5f09b07bdde1955bdcde77afb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 13:38:40 +0200 Subject: [PATCH 255/379] Home printer after aborting Otherwise the head gets left on top of the print and you'd have to manually move it aside after each abort. --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 0100874eab..8ecb503ed8 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -622,6 +622,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._sendCommand("M140 S0") self._sendCommand("M104 S0") self._sendCommand("M107") + self.homeHead() + self.homeBed() self._sendCommand("M84") self._is_printing = False self._is_paused = False From ee52e1b9eaf055433ce5c3367045402c078b50df Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 14:20:49 +0200 Subject: [PATCH 256/379] Reposition prime tower automatically This actually looks really nice. It just moves right along that border there. Eventually we could also auto-position the X position but for now this is fine. --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 43f1453d72..3ee6ac61bb 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -70,7 +70,7 @@ "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "default_value": 177 }, + "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - (brim_width if adhesion_type == 'brim' else (raft_margin if adhesion_type == 'raft' else (skirt_gap if adhesion_type == 'skirt' else 0))) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, From 012d299d980e87136feb8da4062de6940b378c9d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 10 Jul 2017 16:42:38 +0200 Subject: [PATCH 257/379] Prevent circular import When this is imported during the __init__, it'll long have been imported elsewhere and won't need to import it again but still guarantees that it is actually imported if no other module does it first. Contributes to issue CURA-4024. --- cura/Settings/CuraContainerStack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 75f3034362..cdda14ee18 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -8,7 +8,6 @@ from typing import Any, Optional from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject from UM.FlameProfiler import pyqtSlot -import cura.CuraApplication #To get the setting version. from UM.Decorators import override from UM.Logger import Logger from UM.Settings.ContainerStack import ContainerStack, InvalidContainerStackError @@ -48,6 +47,7 @@ class CuraContainerStack(ContainerStack): self.containersChanged.connect(self._onContainersChanged) + import cura.CuraApplication #Here to prevent circular imports. self.addMetaDataEntry("setting_version", cura.CuraApplication.CuraApplication.SettingVersion) # This is emitted whenever the containersChanged signal from the ContainerStack base class is emitted. From aa7ab2e0a764a5a9241829ba9fbf86a258e55085 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 10 Jul 2017 13:25:08 +0200 Subject: [PATCH 258/379] Remove unnecessary eval() construct --- .../MachineSettingsAction.qml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index c531cee31a..cd5854209e 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -189,7 +189,7 @@ Cura.MachineAction sourceComponent: comboBoxWithOptions property string settingKey: "machine_gcode_flavor" property bool forceUpdateOnChange: true - property string afterOnActivate: "manager.updateHasMaterialsMetadata()" + property var afterOnActivate: manager.updateHasMaterialsMetadata } } } @@ -329,7 +329,7 @@ Cura.MachineAction property string settingKey: "material_diameter" property string unit: catalog.i18nc("@label", "mm") property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") - property string afterOnEditingFinished: "manager.updateMaterialForDiameter()" + property var afterOnEditingFinished: manager.updateMaterialForDiameter } Label { @@ -587,8 +587,8 @@ Cura.MachineAction property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative - property string _afterOnEditingFinished: (typeof(afterOnEditingFinished) === 'undefined') ? "": afterOnEditingFinished - property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange + property var _afterOnEditingFinished: (typeof(afterOnEditingFinished) === 'undefined') ? undefined : afterOnEditingFinished + property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider @@ -630,9 +630,9 @@ Cura.MachineAction ExtruderManager.setActiveExtruderIndex(extruderIndex) } } - if(_afterOnEditingFinished != "") + if(_afterOnEditingFinished) { - eval(_afterOnEditingFinished); + _afterOnEditingFinished(); } } } @@ -657,9 +657,9 @@ Cura.MachineAction width: comboBox.width text: _tooltip - property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting - property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange - property string _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? "": afterOnActivate + property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting + property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange + property var _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? undefined : afterOnActivate property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider @@ -725,9 +725,9 @@ Cura.MachineAction { manager.forceUpdate(); } - if(_afterOnActivate != "") + if(_afterOnActivate) { - eval(_afterOnActivate); + _afterOnActivate(); } } } From 0f9125633bf8275ab70c6ca5da5b2b8108f3783e Mon Sep 17 00:00:00 2001 From: 14bitVoid <14bitvoid@protonmail.com> Date: Tue, 11 Jul 2017 02:51:24 +0200 Subject: [PATCH 259/379] Multiply skirt/brim widths with initial layer line width --- cura/BuildVolume.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 53e1471f7b..3701313f85 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -910,21 +910,25 @@ class BuildVolume(SceneNode): if adhesion_type == "skirt": skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap") skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count") - bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingFromAdhesionExtruder("skirt_brim_line_width")) + bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingFromAdhesionExtruder("skirt_brim_line_width")) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 if len(ExtruderManager.getInstance().getUsedExtruderStacks()) > 1: adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")) extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width") + line_width_factors = ExtruderManager.getInstance().getAllExtruderValues("initial_layer_line_width_factor") del extruder_values[adhesion_extruder_nr] # Remove the value of the adhesion extruder nr. - for value in extruder_values: - bed_adhesion_size += value + del line_width_factors[adhesion_extruder_nr] + for i in range(min(len(extruder_values), len(line_width_factors))): + bed_adhesion_size += extruder_values[i] * line_width_factors[i] / 100.0 elif adhesion_type == "brim": - bed_adhesion_size = self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("skirt_brim_line_width") + bed_adhesion_size = self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: adhesion_extruder_nr = int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")) extruder_values = ExtruderManager.getInstance().getAllExtruderValues("skirt_brim_line_width") + line_width_factors = ExtruderManager.getInstance().getAllExtruderValues("initial_layer_line_width_factor") del extruder_values[adhesion_extruder_nr] # Remove the value of the adhesion extruder nr. - for value in extruder_values: - bed_adhesion_size += value + del line_width_factors[adhesion_extruder_nr] + for i in range(min(len(extruder_values), len(line_width_factors))): + bed_adhesion_size += extruder_values[i] * line_width_factors[i] / 100.0 elif adhesion_type == "raft": bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin") elif adhesion_type == "none": @@ -960,7 +964,7 @@ class BuildVolume(SceneNode): def _clamp(self, value, min_value, max_value): return max(min(value, max_value), min_value) - _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"] + _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"] _raft_settings = ["adhesion_type", "raft_base_thickness", "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", "extruder_prime_pos_z", "prime_blob_enable"] From fc936176980cd57636bcddec80b2dbfd9f016e65 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 11:59:55 +0200 Subject: [PATCH 260/379] Don't invert Y direction of offset for disallowed areas --- cura/BuildVolume.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 3701313f85..ea3e9265dc 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -730,8 +730,6 @@ class BuildVolume(SceneNode): offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 - else: - offset_y = -offset_y result[extruder_id] = [] for polygon in machine_disallowed_polygons: From 458c9ac5404da1195dd2d7b3f946c5455278aeb5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 11 Jul 2017 12:01:04 +0200 Subject: [PATCH 261/379] Remove two unnecessary resolveOrValue calls Contributes to CURA-3521 --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 055d8429ef..45a14cd204 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4446,8 +4446,8 @@ "resolve": "max(extruderValues('prime_tower_wall_thickness'))", "minimum_value": "0.001", "minimum_value_warning": "2 * min(extruderValues('prime_tower_line_width')) - 0.0001", - "maximum_value_warning": "resolveOrValue('prime_tower_size') / 2", - "enabled": "resolveOrValue('prime_tower_enable')", + "maximum_value_warning": "prime_tower_size / 2", + "enabled": "prime_tower_enable", "settable_per_mesh": false, "settable_per_extruder": false } From 95b825a4c5bcf346cf914c512cc05f4f5b6e500f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 11 Jul 2017 12:02:44 +0200 Subject: [PATCH 262/379] Emit propertiesChanged on the global stack from the extruder stack But only when the setting that changed has a relation that is not settable per extruder. Fixes CURA-3521 --- cura/Settings/ExtruderStack.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 002778038b..e7f57eb4ef 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -25,6 +25,8 @@ class ExtruderStack(CuraContainerStack): self.addMetaDataEntry("type", "extruder_train") # For backward compatibility + self.propertiesChanged.connect(self._onPropertiesChanged) + ## Overridden from ContainerStack # # This will set the next stack and ensure that we register this stack as an extruder. @@ -85,6 +87,22 @@ class ExtruderStack(CuraContainerStack): if stacks: self.setNextStack(stacks[0]) + def _onPropertiesChanged(self, key, properties): + # When there is a setting that is not settable per extruder that depends on a value from a setting that is, + # we do not always get properly informed that we should re-evaluate the setting. So make sure to indicate + # something changed for those settings. + definitions = self.getNextStack().definition.findDefinitions(key = key) + if definitions: + has_global_dependencies = False + for relation in definitions[0].relations: + if not getattr(relation.target, "settable_per_extruder", True): + has_global_dependencies = True + break + + if has_global_dependencies: + self.getNextStack().propertiesChanged.emit(key, properties) + + extruder_stack_mime = MimeType( name = "application/x-cura-extruderstack", comment = "Cura Extruder Stack", From d6941fef2f8b99abf23dc8822a8f681f6bd6dd52 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 13:22:53 +0200 Subject: [PATCH 263/379] Interpret material compatible 'unknown' as 'yes' We decide whether it is unknown (or unsupported) based on the availability of profiles for it. Contributes to issue EM-1662. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index b6b3e0671c..7f41fac0c5 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -8,7 +8,6 @@ import xml.etree.ElementTree as ET from UM.Resources import Resources from UM.Logger import Logger -from UM.Util import parseBool from cura.CuraApplication import CuraApplication import UM.Dictionary @@ -485,7 +484,7 @@ class XmlMaterialProfile(InstanceContainer): common_setting_values[self.__material_settings_setting_map[key]] = entry.text elif key in self.__unmapped_settings: if key == "hardware compatible": - common_compatibility = parseBool(entry.text) + common_compatibility = self._parseCompatibleValue(entry.text) else: Logger.log("d", "Unsupported material setting %s", key) self._cached_values = common_setting_values # from InstanceContainer ancestor @@ -505,7 +504,7 @@ class XmlMaterialProfile(InstanceContainer): machine_setting_values[self.__material_settings_setting_map[key]] = entry.text elif key in self.__unmapped_settings: if key == "hardware compatible": - machine_compatibility = parseBool(entry.text) + machine_compatibility = self._parseCompatibleValue(entry.text) else: Logger.log("d", "Unsupported material setting %s", key) @@ -568,7 +567,7 @@ class XmlMaterialProfile(InstanceContainer): hotend_setting_values[self.__material_settings_setting_map[key]] = entry.text elif key in self.__unmapped_settings: if key == "hardware compatible": - hotend_compatibility = parseBool(entry.text) + hotend_compatibility = self._parseCompatibleValue(entry.text) else: Logger.log("d", "Unsupported material setting %s", key) @@ -609,6 +608,10 @@ class XmlMaterialProfile(InstanceContainer): else: return material_name + ## Parse the value of the "material compatible" property. + def _parseCompatibleValue(self, value: str): + return value in {"yes", "unknown"} + # Map XML file setting names to internal names __material_settings_setting_map = { "print temperature": "default_material_print_temperature", @@ -670,4 +673,4 @@ def _indent(elem, level = 0): # We are only interested in the actual tag name, so discard everything # before the last } def _tag_without_namespace(element): - return element.tag[element.tag.rfind("}") + 1:] + return element.tag[element.tag.rfind("}") + 1:] \ No newline at end of file From 4c966a183439216285249e5d0102f7724981dc3d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 14:09:44 +0200 Subject: [PATCH 264/379] Fix inheritance formula for prime tower position It now takes the values it depends on from the correct extruder and applies the first layer line width. --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 3ee6ac61bb..81cf9efd91 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -70,7 +70,7 @@ "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - (brim_width if adhesion_type == 'brim' else (raft_margin if adhesion_type == 'raft' else (skirt_gap if adhesion_type == 'skirt' else 0))) - 1" }, + "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - (extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0))) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, From 41103cfca074000bd472b66905e5478adde0a2a6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 14:37:22 +0200 Subject: [PATCH 265/379] Make machine_nozzle_head_distance settable per extruder It won't have an effect on the actual g-code since the engine still requests it from the global stack, but at least the warnings in the log go away. --- 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 45a14cd204..e4252fbc67 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -215,7 +215,7 @@ "default_value": 3, "type": "float", "settable_per_mesh": false, - "settable_per_extruder": false, + "settable_per_extruder": true, "settable_per_meshgroup": false }, "machine_nozzle_expansion_angle": From 0bf0e13adcfc50e25536ae5b656d88932b1cf1b3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 14:39:50 +0200 Subject: [PATCH 266/379] Fix unknown setting machine_nozzle_gantry_distance It has been renamed to gantry_height long ago. --- resources/definitions/alya3dp.def.json | 2 +- resources/definitions/dagoma_discoeasy200.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 1ea16773d6..68da72f1eb 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -39,7 +39,7 @@ "machine_head_shape_max_y": { "default_value": 35 }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_gcode_flavor": { diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 3408c917a6..72ed8f4f8b 100755 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -37,7 +37,7 @@ [16, 37] ] }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_nozzle_offset_x_1": { From a04e389b7fd10f44137d290a181839d703a31e9c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 14:43:26 +0200 Subject: [PATCH 267/379] Fix machine_nozzle_head_polygon The min/max values were long ago replaced by a proper polygon. --- resources/definitions/alya3dp.def.json | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 68da72f1eb..8d1eb6730c 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -27,17 +27,13 @@ "machine_nozzle_size": { "default_value": 0.4 }, - "machine_head_shape_min_x": { - "default_value": 75 - }, - "machine_head_shape_min_y": { - "default_value": 18 - }, - "machine_head_shape_max_x": { - "default_value": 18 - }, - "machine_head_shape_max_y": { - "default_value": 35 + "machine_head_polygon": { + "default_value": [ + [75, 18], + [18, 18], + [18, 35], + [75, 35] + ] }, "gantry_height": { "default_value": 55 From a04cb7524dc933718f1e608ca29bc156fbcaf435 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 14:47:10 +0200 Subject: [PATCH 268/379] Remove nonsensical global nozzle offsets for Dagoma DiscoEasy200 It doesn't make sense to always have a nozzle offset for all nozzles. What's more, the setting only exists in fdmextruder.def.json so it can't be set in something that inherits from fdmprinter.def.json. --- README.md | 2 +- resources/definitions/dagoma_discoeasy200.def.json | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index c1ebb0993b..256bbbd55b 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ There are two ways of doing it. You can either use the generator [here](http://q * Set your machine's dimensions with machine_width, machine_depth, and machine_height * If your printer's origin is in the center of the bed, set machine_center_is_zero to true. * Set your print head dimensions with the machine_head_shape parameters -* Set the nozzle offset with machine_nozzle_offset_x_1 and machine_nozzle_offset_y1 +* Set the nozzle offset with machine_nozzle_offset_x and machine_nozzle_offset_y * Set the start and end gcode in machine_start_gcode and machine_end_gcode * If your printer has a heated bed, set visible to true under material_bed_temperature diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 72ed8f4f8b..718c5b0873 100755 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -40,12 +40,6 @@ "gantry_height": { "default_value": 55 }, - "machine_nozzle_offset_x_1": { - "default_value": 18 - }, - "machine_nozzle_offset_y_1": { - "default_value": 0 - }, "machine_gcode_flavor": { "default_value": "RepRap" }, From 2ba0dd094ed3c9c37c6ee0cdd25694ab1c0c96b1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 11 Jul 2017 15:54:21 +0200 Subject: [PATCH 269/379] Simplify layout --- .../MachineSettingsAction.qml | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index cd5854209e..4cc1cfb9d4 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -135,27 +135,23 @@ Cura.MachineAction property string unit: catalog.i18nc("@label", "mm") property bool forceUpdateOnChange: true } - } - Column - { - Row + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + + Label { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: catalog.i18nc("@label", "Build Plate Shape") - } - - Loader - { - id: shapeComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_shape" - property bool forceUpdateOnChange: true - } + text: catalog.i18nc("@label", "Build Plate Shape") } + + Loader + { + id: shapeComboBox + sourceComponent: comboBoxWithOptions + property string settingKey: "machine_shape" + property bool forceUpdateOnChange: true + } + Loader { id: centerIsZeroCheckBox @@ -164,6 +160,7 @@ Cura.MachineAction property string settingKey: "machine_center_is_zero" property bool forceUpdateOnChange: true } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } Loader { id: heatedBedCheckBox @@ -172,11 +169,10 @@ Cura.MachineAction property var settingKey: "machine_heated_bed" property bool forceUpdateOnChange: true } - } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Row - { - spacing: UM.Theme.getSize("default_margin").width + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } Label { From 7de501ac87c46d9d1a279fc3d19b6fa5d00be005 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Jul 2017 16:32:31 +0200 Subject: [PATCH 270/379] Update description of initial layer line width It now does apply to bed adhesion features. Contributes to issue CURA-4027. --- 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 e4252fbc67..723723c0a2 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -828,7 +828,7 @@ "initial_layer_line_width_factor": { "label": "Initial Layer Line Width", - "description": "Multiplier of the line width on the first layer. Doesn't apply to brim, raft and skirt.", + "description": "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion.", "type": "float", "unit": "%", "default_value": 100.0, From 219d1938c2f0a8acba3eaa3f41c6b744ff47d411 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 11 Jul 2017 16:40:05 +0200 Subject: [PATCH 271/379] Move labels into components with the controls... ...so they are both children of the same TooltipArea --- .../MachineSettingsAction.qml | 677 +++++++++--------- 1 file changed, 333 insertions(+), 344 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 4cc1cfb9d4..2653865b26 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -83,7 +83,7 @@ Cura.MachineAction Column { width: settingsTabs.columnWidth - spacing: UM.Theme.getSize("default_margin").height + spacing: UM.Theme.getSize("default_lining").height Label { @@ -91,109 +91,83 @@ Cura.MachineAction font.bold: true } - Grid + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + + Loader { - columns: 2 - columnSpacing: UM.Theme.getSize("default_margin").width - rowSpacing: UM.Theme.getSize("default_lining").width + id: buildAreaWidthField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_width" + property string label: catalog.i18nc("@label", "X (Width)") + property string unit: catalog.i18nc("@label", "mm") + property bool forceUpdateOnChange: true + } - Label - { - text: catalog.i18nc("@label", "X (Width)") - } - Loader - { - id: buildAreaWidthField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_width" - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } + Loader + { + id: buildAreaDepthField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_depth" + property string label: catalog.i18nc("@label", "Y (Depth)") + property string unit: catalog.i18nc("@label", "mm") + property bool forceUpdateOnChange: true + } - Label - { - text: catalog.i18nc("@label", "Y (Depth)") - } - Loader - { - id: buildAreaDepthField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_depth" - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } + Loader + { + id: buildAreaHeightField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_height" + property string label: catalog.i18nc("@label", "Z (Height)") + property string unit: catalog.i18nc("@label", "mm") + property bool forceUpdateOnChange: true + } - Label - { - text: catalog.i18nc("@label", "Z (Height)") - } - Loader - { - id: buildAreaHeightField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_height" - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + Loader + { + id: shapeComboBox + sourceComponent: comboBoxWithOptions + property string settingKey: "machine_shape" + property string label: catalog.i18nc("@label", "Build plate shape") + property bool forceUpdateOnChange: true + } - Label - { - text: catalog.i18nc("@label", "Build Plate Shape") - } + Loader + { + id: centerIsZeroCheckBox + sourceComponent: simpleCheckBox + property string settingKey: "machine_center_is_zero" + property string label: catalog.i18nc("@option:check", "Origin at center") + property bool forceUpdateOnChange: true + } + Loader + { + id: heatedBedCheckBox + sourceComponent: simpleCheckBox + property var settingKey: "machine_heated_bed" + property string label: catalog.i18nc("@option:check", "Heated bed") + property bool forceUpdateOnChange: true + } - Loader - { - id: shapeComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_shape" - property bool forceUpdateOnChange: true - } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Loader - { - id: centerIsZeroCheckBox - sourceComponent: simpleCheckBox - property string label: catalog.i18nc("@option:check", "Machine Center is Zero") - property string settingKey: "machine_center_is_zero" - property bool forceUpdateOnChange: true - } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Loader - { - id: heatedBedCheckBox - sourceComponent: simpleCheckBox - property string label: catalog.i18nc("@option:check", "Heated Bed") - property var settingKey: "machine_heated_bed" - property bool forceUpdateOnChange: true - } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Label - { - text: catalog.i18nc("@label", "GCode Flavor") - } - - Loader - { - id: gcodeFlavorComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_gcode_flavor" - property bool forceUpdateOnChange: true - property var afterOnActivate: manager.updateHasMaterialsMetadata - } + Loader + { + id: gcodeFlavorComboBox + sourceComponent: comboBoxWithOptions + property string settingKey: "machine_gcode_flavor" + property string label: catalog.i18nc("@label", "GCode flavor") + property bool forceUpdateOnChange: true + property var afterOnActivate: manager.updateHasMaterialsMetadata } } Column { width: settingsTabs.columnWidth - spacing: UM.Theme.getSize("default_margin").height + spacing: UM.Theme.getSize("default_lining").height Label { @@ -201,97 +175,79 @@ Cura.MachineAction font.bold: true } - Grid + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + + Loader { - columns: 2 - columnSpacing: UM.Theme.getSize("default_margin").width - rowSpacing: UM.Theme.getSize("default_lining").width + id: printheadXMinField + sourceComponent: headPolygonTextField + property string label: catalog.i18nc("@label", "X min") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") + property string axis: "x" + property string side: "min" + } - Label - { - text: catalog.i18nc("@label", "X min") - } - Loader - { - id: printheadXMinField - sourceComponent: headPolygonTextField - property string axis: "x" - property string side: "min" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - } + Loader + { + id: printheadYMinField + sourceComponent: headPolygonTextField + property string label: catalog.i18nc("@label", "Y min") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") + property string axis: "y" + property string side: "min" + } - Label - { - text: catalog.i18nc("@label", "Y min") - } - Loader - { - id: printheadYMinField - sourceComponent: headPolygonTextField - property string axis: "y" - property string side: "min" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - } + Loader + { + id: printheadXMaxField + sourceComponent: headPolygonTextField + property string label: catalog.i18nc("@label", "X max") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") + property string axis: "x" + property string side: "max" + } - Label - { - text: catalog.i18nc("@label", "X max") - } - Loader - { - id: printheadXMaxField - sourceComponent: headPolygonTextField - property string axis: "x" - property string side: "max" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - } + Loader + { + id: printheadYMaxField + sourceComponent: headPolygonTextField + property string label: catalog.i18nc("@label", "Y max") + property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") + property string axis: "y" + property string side: "max" + } - Label - { - text: catalog.i18nc("@label", "Y max") - } - Loader - { - id: printheadYMaxField - sourceComponent: headPolygonTextField - property string axis: "y" - property string side: "max" - property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + Loader + { + id: gantryHeightField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "gantry_height" + property string label: catalog.i18nc("@label", "Gantry height") + property string unit: catalog.i18nc("@label", "mm") + property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".") + } - Label + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + + UM.TooltipArea + { + id: extruderCountControl + visible: manager.definedExtruderCount > 1 + height: childrenRect.height + width: childrenRect.width + text: machineExtruderCountProvider.properties.description + + Row { - text: catalog.i18nc("@label", "Gantry height") - } - Loader - { - id: gantryHeightField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "gantry_height" - property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".") - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Label - { - text: catalog.i18nc("@label", "Number of Extruders") - visible: extruderCountControl.visible - } - - UM.TooltipArea - { - id: extruderCountControl - visible: manager.definedExtruderCount > 1 - height: extruderCountComboBox.height - width: extruderCountComboBox.width - text: machineExtruderCountProvider.properties.description + spacing: UM.Theme.getSize("default_margin").width + Label + { + text: catalog.i18nc("@label", "Number of Extruders") + anchors.verticalCenter: extruderCountComboBox.verticalCenter + } ComboBox { id: extruderCountComboBox @@ -313,33 +269,26 @@ Cura.MachineAction } } } + } - Label - { - text: catalog.i18nc("@label", "Material Diameter") - } - Loader - { - id: materialDiameterField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "material_diameter" - property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") - property var afterOnEditingFinished: manager.updateMaterialForDiameter - } - Label - { - text: catalog.i18nc("@label", "Nozzle size") - visible: nozzleSizeField.visible - } - Loader - { - id: nozzleSizeField - visible: !Cura.MachineManager.hasVariants && machineExtruderCountProvider.properties.value == 1 - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_size" - property string unit: catalog.i18nc("@label", "mm") - } + Loader + { + id: materialDiameterField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "material_diameter" + property string unit: catalog.i18nc("@label", "mm") + property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") + property var afterOnEditingFinished: manager.updateMaterialForDiameter + property string label: catalog.i18nc("@label", "Material diameter") + } + Loader + { + id: nozzleSizeField + visible: !Cura.MachineManager.hasVariants && machineExtruderCountProvider.properties.value == 1 + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_nozzle_size" + property string label: catalog.i18nc("@label", "Nozzle size") + property string unit: catalog.i18nc("@label", "mm") } } } @@ -413,7 +362,7 @@ Cura.MachineAction Column { - spacing: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_lining").width Label { @@ -421,57 +370,45 @@ Cura.MachineAction font.bold: true } - Grid + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + + Loader { - columns: 2 - columnSpacing: UM.Theme.getSize("default_margin").width - rowSpacing: UM.Theme.getSize("default_lining").width - - Label - { - text: catalog.i18nc("@label", "Nozzle size") - visible: extruderNozzleSizeField.visible - } - Loader - { - id: extruderNozzleSizeField - visible: !Cura.MachineManager.hasVariants - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_size" - property bool isExtruderSetting: true - property string unit: catalog.i18nc("@label", "mm") - } - - Label - { - text: catalog.i18nc("@label", "Nozzle offset X") - } - Loader - { - id: extruderOffsetXField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_offset_x" - property string unit: catalog.i18nc("@label", "mm") - property bool isExtruderSetting: true - property bool forceUpdateOnChange: true - property bool allowNegative: true - } - Label - { - text: catalog.i18nc("@label", "Nozzle offset Y") - } - Loader - { - id: extruderOffsetYField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_offset_y" - property string unit: catalog.i18nc("@label", "mm") - property bool isExtruderSetting: true - property bool forceUpdateOnChange: true - property bool allowNegative: true - } + id: extruderNozzleSizeField + visible: !Cura.MachineManager.hasVariants + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_nozzle_size" + property string label: catalog.i18nc("@label", "Nozzle size") + property string unit: catalog.i18nc("@label", "mm") + property bool isExtruderSetting: true } + Loader + { + id: extruderOffsetXField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_nozzle_offset_x" + property string label: catalog.i18nc("@label", "Nozzle offset X") + property string unit: catalog.i18nc("@label", "mm") + property bool isExtruderSetting: true + property bool forceUpdateOnChange: true + property bool allowNegative: true + } + + Loader + { + id: extruderOffsetYField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_nozzle_offset_y" + property string label: catalog.i18nc("@label", "Nozzle offset Y") + property string unit: catalog.i18nc("@label", "mm") + property bool isExtruderSetting: true + property bool forceUpdateOnChange: true + property bool allowNegative: true + } + + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } + Row { spacing: UM.Theme.getSize("default_margin").width @@ -577,14 +514,15 @@ Cura.MachineAction id: numericTextFieldWithUnit UM.TooltipArea { - height: textField.height - width: textField.width + height: childrenRect.height + width: childrenRect.width text: _tooltip property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative property var _afterOnEditingFinished: (typeof(afterOnEditingFinished) === 'undefined') ? undefined : afterOnEditingFinished property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange + property string _label: (typeof(label) === 'undefined') ? "" : label property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider @@ -607,40 +545,59 @@ Cura.MachineAction storeIndex: manager.containerIndex } - TextField + Row { - id: textField - text: (propertyProvider.properties.value) ? propertyProvider.properties.value : "" - validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.]{0,6}/ : /[0-9\.]{0,6}/ } - onEditingFinished: + spacing: UM.Theme.getSize("default_margin").width + + Label { - if (propertyProvider && text != propertyProvider.properties.value) + text: _label + visible: _label != "" + anchors.verticalCenter: textFieldWithUnit.verticalCenter + } + + Item + { + width: textField.width + height: textField.height + + id: textFieldWithUnit + TextField { - propertyProvider.setPropertyValue("value", text); - if(_forceUpdateOnChange) + id: textField + text: (propertyProvider.properties.value) ? propertyProvider.properties.value : "" + validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.]{0,6}/ : /[0-9\.]{0,6}/ } + onEditingFinished: { - var extruderIndex = ExtruderManager.activeExtruderIndex; - manager.forceUpdate(); - if(ExtruderManager.activeExtruderIndex != extruderIndex) + if (propertyProvider && text != propertyProvider.properties.value) { - ExtruderManager.setActiveExtruderIndex(extruderIndex) + propertyProvider.setPropertyValue("value", text); + if(_forceUpdateOnChange) + { + var extruderIndex = ExtruderManager.activeExtruderIndex; + manager.forceUpdate(); + if(ExtruderManager.activeExtruderIndex != extruderIndex) + { + ExtruderManager.setActiveExtruderIndex(extruderIndex) + } + } + if(_afterOnEditingFinished) + { + _afterOnEditingFinished(); + } } } - if(_afterOnEditingFinished) - { - _afterOnEditingFinished(); - } + } + + Label + { + text: unit + anchors.right: textField.right + anchors.rightMargin: y - textField.y + anchors.verticalCenter: textField.verticalCenter } } } - - Label - { - text: unit - anchors.right: textField.right - anchors.rightMargin: y - textField.y - anchors.verticalCenter: textField.verticalCenter - } } } @@ -649,13 +606,14 @@ Cura.MachineAction id: comboBoxWithOptions UM.TooltipArea { - height: comboBox.height - width: comboBox.width + height: childrenRect.height + width: childrenRect.width text: _tooltip property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange property var _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? undefined : afterOnActivate + property string _label: (typeof(label) === 'undefined') ? "" : label property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider @@ -678,52 +636,63 @@ Cura.MachineAction storeIndex: manager.containerIndex } - ComboBox + Row { - id: comboBox - model: ListModel + spacing: UM.Theme.getSize("default_margin").width + + Label { - id: optionsModel - Component.onCompleted: + text: _label + visible: _label != "" + anchors.verticalCenter: textFieldWithUnit.verticalCenter + } + ComboBox + { + id: comboBox + model: ListModel { - // Options come in as a string-representation of an OrderedDict - var options = propertyProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/); - if(options) + id: optionsModel + Component.onCompleted: { - options = options[1].split("), (") - for(var i = 0; i < options.length; i++) + // Options come in as a string-representation of an OrderedDict + var options = propertyProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/); + if(options) { - var option = options[i].substring(1, options[i].length - 1).split("', '") - optionsModel.append({text: option[1], value: option[0]}); + options = options[1].split("), (") + for(var i = 0; i < options.length; i++) + { + var option = options[i].substring(1, options[i].length - 1).split("', '") + optionsModel.append({text: option[1], value: option[0]}); + } } } } - } - currentIndex: - { - var currentValue = propertyProvider.properties.value; - var index = 0; - for(var i = 0; i < optionsModel.count; i++) + currentIndex: { - if(optionsModel.get(i).value == currentValue) { - index = i; - break; + var currentValue = propertyProvider.properties.value; + var index = 0; + for(var i = 0; i < optionsModel.count; i++) + { + if(optionsModel.get(i).value == currentValue) { + index = i; + break; + } } + return index } - return index - } - onActivated: - { - if(propertyProvider.properties.value != optionsModel.get(index).value) + onActivated: { - propertyProvider.setPropertyValue("value", optionsModel.get(index).value); - if(_forceUpdateOnChange) + if(propertyProvider.properties.value != optionsModel.get(index).value) { - manager.forceUpdate(); - } - if(_afterOnActivate) - { - _afterOnActivate(); + propertyProvider.setPropertyValue("value", optionsModel.get(index).value); + if(_forceUpdateOnChange) + { + manager.forceUpdate(); + } + if(_afterOnActivate) + { + _afterOnActivate(); + } } } } @@ -795,50 +764,70 @@ Cura.MachineAction width: textField.width text: tooltip - TextField + property string _label: (typeof(label) === 'undefined') ? "" : label + + Row { - id: textField - text: + spacing: UM.Theme.getSize("default_margin").width + + Label { - var polygon = JSON.parse(machineHeadPolygonProvider.properties.value); - var item = (axis == "x") ? 0 : 1 - var result = polygon[0][item]; - for(var i = 1; i < polygon.length; i++) { - if (side == "min") { - result = Math.min(result, polygon[i][item]); - } else { - result = Math.max(result, polygon[i][item]); + text: _label + visible: _label != "" + anchors.verticalCenter: textFieldWithUnit.verticalCenter + } + + Item + { + width: textField.width + height: textField.height + + TextField + { + id: textField + text: + { + var polygon = JSON.parse(machineHeadPolygonProvider.properties.value); + var item = (axis == "x") ? 0 : 1 + var result = polygon[0][item]; + for(var i = 1; i < polygon.length; i++) { + if (side == "min") { + result = Math.min(result, polygon[i][item]); + } else { + result = Math.max(result, polygon[i][item]); + } + } + result = Math.abs(result); + printHeadPolygon[axis][side] = result; + return result; + } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } + onEditingFinished: + { + printHeadPolygon[axis][side] = parseFloat(textField.text); + var polygon = []; + polygon.push([-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]]); + polygon.push([-printHeadPolygon["x"]["min"],-printHeadPolygon["y"]["min"]]); + polygon.push([ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]]); + polygon.push([ printHeadPolygon["x"]["max"],-printHeadPolygon["y"]["mìn"]]); + var polygon_string = JSON.stringify(polygon); + if(polygon_string != machineHeadPolygonProvider.properties.value) + { + machineHeadPolygonProvider.setPropertyValue("value", polygon_string); + manager.forceUpdate(); + } } } - result = Math.abs(result); - printHeadPolygon[axis][side] = result; - return result; - } - validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } - onEditingFinished: - { - printHeadPolygon[axis][side] = parseFloat(textField.text); - var polygon = []; - polygon.push([-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]]); - polygon.push([-printHeadPolygon["x"]["min"],-printHeadPolygon["y"]["min"]]); - polygon.push([ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]]); - polygon.push([ printHeadPolygon["x"]["max"],-printHeadPolygon["y"]["mìn"]]); - var polygon_string = JSON.stringify(polygon); - if(polygon_string != machineHeadPolygonProvider.properties.value) + + Label { - machineHeadPolygonProvider.setPropertyValue("value", polygon_string); - manager.forceUpdate(); + text: catalog.i18nc("@label", "mm") + anchors.right: textField.right + anchors.rightMargin: y - textField.y + anchors.verticalCenter: textField.verticalCenter } } } - - Label - { - text: catalog.i18nc("@label", "mm") - anchors.right: textField.right - anchors.rightMargin: y - textField.y - anchors.verticalCenter: textField.verticalCenter - } } } From 391533e939c9e6e59eaabfd068893983f7a1e712 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 11 Jul 2017 17:09:59 +0200 Subject: [PATCH 272/379] Slice info is now sent by https --- plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 83f17dcb27..a51e96aa9c 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -31,7 +31,7 @@ catalog = i18nCatalog("cura") # The data is only sent when the user in question gave permission to do so. All data is anonymous and # no model files are being sent (Just a SHA256 hash of the model). class SliceInfo(Extension): - info_url = "http://stats.ultimaker.com/api/cura" + info_url = "https://stats.ultimaker.com/api/cura" def __init__(self): super().__init__() From d00bb2524e92d56cdbedc741d3da2c1b1fbac628 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 11 Jul 2017 17:21:17 +0200 Subject: [PATCH 273/379] Fix layout Dialog is now more robust against being too small --- .../MachineSettingsAction.qml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 2653865b26..13e100590f 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -41,7 +41,7 @@ Cura.MachineAction anchors.fill: parent; Item { - id: bedLevelMachineAction + id: machineSettingsAction anchors.fill: parent; UM.I18nCatalog { id: catalog; name: "cura"; } @@ -233,7 +233,6 @@ Cura.MachineAction UM.TooltipArea { - id: extruderCountControl visible: manager.definedExtruderCount > 1 height: childrenRect.height width: childrenRect.width @@ -246,6 +245,8 @@ Cura.MachineAction Label { text: catalog.i18nc("@label", "Number of Extruders") + elide: Text.ElideRight + width: Math.max(0, settingsTabs.columnWidth - 2 * UM.Theme.getSize("default_margin").width - extruderCountComboBox.width) anchors.verticalCenter: extruderCountComboBox.verticalCenter } ComboBox @@ -553,6 +554,8 @@ Cura.MachineAction { text: _label visible: _label != "" + elide: Text.ElideRight + width: Math.max(0, settingsTabs.columnWidth - 2 * UM.Theme.getSize("default_margin").width - textFieldWithUnit.width) anchors.verticalCenter: textFieldWithUnit.verticalCenter } @@ -644,7 +647,9 @@ Cura.MachineAction { text: _label visible: _label != "" - anchors.verticalCenter: textFieldWithUnit.verticalCenter + elide: Text.ElideRight + width: Math.max(0, settingsTabs.columnWidth - 2 * UM.Theme.getSize("default_margin").width - comboBox.width) + anchors.verticalCenter: comboBox.verticalCenter } ComboBox { @@ -774,11 +779,14 @@ Cura.MachineAction { text: _label visible: _label != "" + elide: Text.ElideRight + width: Math.max(0, settingsTabs.columnWidth - 2 * UM.Theme.getSize("default_margin").width - textFieldWithUnit.width) anchors.verticalCenter: textFieldWithUnit.verticalCenter } Item { + id: textFieldWithUnit width: textField.width height: textField.height From 1b4bd0510602c92544b13122ebd2cf520cbaa930 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 11 Jul 2017 23:27:31 +0200 Subject: [PATCH 274/379] Make doubly sure that settings are changed before closing dialog --- .../MachineSettingsAction.qml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 13e100590f..77a9d6292d 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -31,11 +31,17 @@ Cura.MachineAction target: dialog ? dialog : null ignoreUnknownSignals: true // Any which way this action dialog is dismissed, make sure it is properly finished - onNextClicked: manager.onFinishAction() - onBackClicked: manager.onFinishAction() - onAccepted: manager.onFinishAction() - onRejected: manager.onFinishAction() - onClosing: manager.onFinishAction() + onNextClicked: finishAction() + onBackClicked: finishAction() + onAccepted: finishAction() + onRejected: finishAction() + onClosing: finishAction() + } + + function finishAction() + { + forceActiveFocus(); + manager.onFinishAction(); } anchors.fill: parent; From c27859ddc539b722a665e5bbe785d1fd8aa89acf Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 11 Jul 2017 23:32:47 +0200 Subject: [PATCH 275/379] Fix spelling for consistency --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 77a9d6292d..897fb2a051 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -164,7 +164,7 @@ Cura.MachineAction id: gcodeFlavorComboBox sourceComponent: comboBoxWithOptions property string settingKey: "machine_gcode_flavor" - property string label: catalog.i18nc("@label", "GCode flavor") + property string label: catalog.i18nc("@label", "Gcode flavor") property bool forceUpdateOnChange: true property var afterOnActivate: manager.updateHasMaterialsMetadata } From 50d3ba9fbe26e7869ae4f161c7eae9c7cd005440 Mon Sep 17 00:00:00 2001 From: maukcc Date: Wed, 12 Jul 2017 13:43:54 +0200 Subject: [PATCH 276/379] Cartesio extruders start positions Cartesio extruders start and end positions added --- resources/definitions/cartesio.def.json | 1 + resources/extruders/cartesio_extruder_0.def.json | 13 ++++++++++--- resources/extruders/cartesio_extruder_1.def.json | 13 ++++++++++--- resources/extruders/cartesio_extruder_2.def.json | 13 ++++++++++--- resources/extruders/cartesio_extruder_3.def.json | 13 ++++++++++--- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index d065d6a7c6..bbc62bdf75 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -50,6 +50,7 @@ "prime_tower_wall_thickness": { "resolve": 0.7 }, "prime_tower_position_x": { "default_value": 50 }, "prime_tower_position_y": { "default_value": 150 }, + "prime_blob_enable": { "default_value": false }, "machine_max_feedrate_z": { "default_value": 20 }, "machine_disallowed_areas": { "default_value": [ [[215, 135], [-215, 135], [-215, 75], [215, 75]] diff --git a/resources/extruders/cartesio_extruder_0.def.json b/resources/extruders/cartesio_extruder_0.def.json index 9b25b366f7..4b4c3f2689 100644 --- a/resources/extruders/cartesio_extruder_0.def.json +++ b/resources/extruders/cartesio_extruder_0.def.json @@ -16,10 +16,17 @@ "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_extruder_start_code": { - "default_value": "\n;start extruder_0\n\nM117 printing\n" + "default_value": "\n;start extruder_0\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T0 S160\nG91\nG1 Z5 F900\nG90\nG1 X1 Y260 F9000\n;end extruder_0\nM117 temp is {material_print_temp}" - } + "default_value": "\nM104 T0 S160\n;end extruder_0\nM117 temp is {material_print_temp}\n" + }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "default_value": 48 }, + "machine_extruder_start_pos_y": { "default_value": 16 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "default_value": 24 }, + "machine_extruder_end_pos_y": { "default_value": 16 } } } diff --git a/resources/extruders/cartesio_extruder_1.def.json b/resources/extruders/cartesio_extruder_1.def.json index 939b1fd7c8..2fd518266d 100644 --- a/resources/extruders/cartesio_extruder_1.def.json +++ b/resources/extruders/cartesio_extruder_1.def.json @@ -16,10 +16,17 @@ "machine_nozzle_offset_x": { "default_value": 24.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_extruder_start_code": { - "default_value": "\n;start extruder_1\n\nM117 printing\n" + "default_value": "\n;start extruder_1\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T1 S160\nG91\nG1 Z5 F900\nG90\nG1 X1 Y260 F9000\n;end extruder_1\n" - } + "default_value": "\nM104 T1 S160\n;end extruder_1\n" + }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "default_value": 24 }, + "machine_extruder_start_pos_y": { "default_value": 16 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "default_value": 48 }, + "machine_extruder_end_pos_y": { "default_value": 16 } } } diff --git a/resources/extruders/cartesio_extruder_2.def.json b/resources/extruders/cartesio_extruder_2.def.json index c4ad94f635..6245de6103 100644 --- a/resources/extruders/cartesio_extruder_2.def.json +++ b/resources/extruders/cartesio_extruder_2.def.json @@ -16,10 +16,17 @@ "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_extruder_start_code": { - "default_value": "\n;start extruder_2\n\nM117 printing\n" + "default_value": "\n;start extruder_2\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T2 S160\nG91\nG1 Z5 F900\nG90\nG1 X1 Y260 F9000\n;end extruder_2\n" - } + "default_value": "\nM104 T2 S160\n;end extruder_2\n" + }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "default_value": 24 }, + "machine_extruder_start_pos_y": { "default_value": 309 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "default_value": 48 }, + "machine_extruder_end_pos_y": { "default_value": 309 } } } diff --git a/resources/extruders/cartesio_extruder_3.def.json b/resources/extruders/cartesio_extruder_3.def.json index 589942fc6d..f5e6527907 100644 --- a/resources/extruders/cartesio_extruder_3.def.json +++ b/resources/extruders/cartesio_extruder_3.def.json @@ -16,10 +16,17 @@ "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_extruder_start_code": { - "default_value": "\n;start extruder_3\n\nM117 printing\n" + "default_value": "\n;start extruder_3\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T3 S160\nG91\nG1 Z5 F900\nG90\nG1 X1 Y260 F9000\n;end extruder_3\n" - } + "default_value": "\nM104 T3 S160\n;end extruder_3\n" + }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "default_value": 48 }, + "machine_extruder_start_pos_y": { "default_value": 309 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "default_value": 24 }, + "machine_extruder_end_pos_y": { "default_value": 309} } } From 6cb5412f914329c6137e6820b965497426d149aa Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 12 Jul 2017 13:47:31 +0200 Subject: [PATCH 277/379] Fix creating a new definition_changes container global_container_stack.definitionChanges always returns a container, global_container_stack.findContainer({"type": "definition_changes"}) does not (because an empty container does not have the type "definition_changes". --- plugins/UltimakerMachineActions/UMOUpgradeSelection.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py index 476089e533..aa711e09cf 100644 --- a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py @@ -36,8 +36,8 @@ class UMOUpgradeSelection(MachineAction): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: # Make sure there is a definition_changes container to store the machine settings - definition_changes_container = global_container_stack.definition_changes - if not definition_changes_container: + definition_changes_container = global_container_stack.definitionChanges + if definition_changes_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): definition_changes_container = self._createDefinitionChangesContainer(global_container_stack) definition_changes_container.setProperty("machine_heated_bed", "value", heated_bed) @@ -51,7 +51,7 @@ class UMOUpgradeSelection(MachineAction): definition_changes_container.addMetaDataEntry("type", "definition_changes") definition_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().addContainer(definition_changes_container) + ContainerRegistry.getInstance().addContainer(definition_changes_container) global_container_stack.definitionChanges = definition_changes_container return definition_changes_container From 7e7e15a12b45cb707149febedec5fe1694f7d73b Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Wed, 14 Sep 2016 14:57:43 -0400 Subject: [PATCH 278/379] Fix MachineManager connection to OutputDeviceManager signals late. If a PrinterOutputDevice is able to connect quickly to a machine, then by the time the MachineManager is created and connects to the signal, it will be too late, and it might miss that there is already connected devices. # Conflicts: # plugins/USBPrinting/USBPrinterOutputDeviceManager.py --- cura/Settings/MachineManager.py | 2 ++ .../USBPrinterOutputDeviceManager.py | 26 ++++++------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6499e527f5..1675438625 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -91,6 +91,8 @@ class MachineManager(QObject): self._printer_output_devices = [] Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + # There might already be some output devices by the time the signal is connected + self._onOutputDevicesChanged() if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacks(id = active_machine_id): # An active machine was saved, so restore it. diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 7a62a59a45..26cf5f3942 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -19,6 +19,7 @@ import platform import glob import time import os.path +import serial.tools.list_ports from UM.Extension import Extension from PyQt5.QtQml import QQmlComponent, QQmlContext @@ -252,24 +253,13 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): # \param only_list_usb If true, only usb ports are listed def getSerialPortList(self, only_list_usb = False): base_list = [] - if platform.system() == "Windows": - import winreg # type: ignore @UnresolvedImport - try: - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM") - i = 0 - while True: - values = winreg.EnumValue(key, i) - if not only_list_usb or "USBSER" or "VCP" in values[0]: - base_list += [values[1]] - i += 1 - except Exception as e: - pass - else: - if only_list_usb: - base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.usb*") + glob.glob("/dev/tty.wchusb*") + glob.glob("/dev/cu.wchusb*") - base_list = filter(lambda s: "Bluetooth" not in s, base_list) # Filter because mac sometimes puts them in the list - else: - base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/tty.wchusb*") + glob.glob("/dev/cu.wchusb*") + glob.glob("/dev/rfcomm*") + glob.glob("/dev/serial/by-id/*") + for port in serial.tools.list_ports.comports(): + if not isinstance(port, tuple): + port = (port.device, port.description, port.hwid) + if only_list_usb and not port[2].startswith("USB"): + continue + base_list += [port[0]] + return list(base_list) _instance = None # type: "USBPrinterOutputDeviceManager" From 82d3a98f952cf56974b86ed680566a3ad199399f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 12 Jul 2017 14:47:38 +0200 Subject: [PATCH 279/379] Hide the extruder button for Custom FDM Printers with 1 extruder --- resources/qml/Toolbar.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 1044bfbfcf..0903c0555b 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -74,7 +74,8 @@ Item Repeater { id: extruders - model: Cura.ExtrudersModel { id: extrudersModel } + property var _model: Cura.ExtrudersModel { id: extrudersModel } + model: _model.items.length > 1 ? _model : 0 ExtruderButton { extruder: model } } } From 2928b1d5e07c17a66e8e3013a7b532b4d63bd8f3 Mon Sep 17 00:00:00 2001 From: maukcc Date: Wed, 12 Jul 2017 15:30:12 +0200 Subject: [PATCH 280/379] Cartesio additional extruder position updates --- resources/extruders/cartesio_extruder_0.def.json | 6 +++--- resources/extruders/cartesio_extruder_1.def.json | 6 +++--- resources/extruders/cartesio_extruder_2.def.json | 2 +- resources/extruders/cartesio_extruder_3.def.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/extruders/cartesio_extruder_0.def.json b/resources/extruders/cartesio_extruder_0.def.json index 4b4c3f2689..f1423f3530 100644 --- a/resources/extruders/cartesio_extruder_0.def.json +++ b/resources/extruders/cartesio_extruder_0.def.json @@ -19,14 +19,14 @@ "default_value": "\n;start extruder_0\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T0 S160\n;end extruder_0\nM117 temp is {material_print_temp}\n" + "default_value": "\nM104 T0 S120\n;end extruder_0\nM117 temp is {material_print_temp}\n" }, "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "default_value": 48 }, + "machine_extruder_start_pos_x": { "default_value": 24 }, "machine_extruder_start_pos_y": { "default_value": 16 }, "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "default_value": 24 }, + "machine_extruder_end_pos_x": { "default_value": 48 }, "machine_extruder_end_pos_y": { "default_value": 16 } } } diff --git a/resources/extruders/cartesio_extruder_1.def.json b/resources/extruders/cartesio_extruder_1.def.json index 2fd518266d..402553ff96 100644 --- a/resources/extruders/cartesio_extruder_1.def.json +++ b/resources/extruders/cartesio_extruder_1.def.json @@ -19,14 +19,14 @@ "default_value": "\n;start extruder_1\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T1 S160\n;end extruder_1\n" + "default_value": "\nM104 T1 S120\n;end extruder_1\n" }, "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "default_value": 24 }, + "machine_extruder_start_pos_x": { "default_value": 48 }, "machine_extruder_start_pos_y": { "default_value": 16 }, "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "default_value": 48 }, + "machine_extruder_end_pos_x": { "default_value": 24 }, "machine_extruder_end_pos_y": { "default_value": 16 } } } diff --git a/resources/extruders/cartesio_extruder_2.def.json b/resources/extruders/cartesio_extruder_2.def.json index 6245de6103..e8f47772cb 100644 --- a/resources/extruders/cartesio_extruder_2.def.json +++ b/resources/extruders/cartesio_extruder_2.def.json @@ -19,7 +19,7 @@ "default_value": "\n;start extruder_2\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T2 S160\n;end extruder_2\n" + "default_value": "\nM104 T2 S120\n;end extruder_2\n" }, "machine_extruder_start_pos_abs": { "default_value": true }, diff --git a/resources/extruders/cartesio_extruder_3.def.json b/resources/extruders/cartesio_extruder_3.def.json index f5e6527907..a3e435470a 100644 --- a/resources/extruders/cartesio_extruder_3.def.json +++ b/resources/extruders/cartesio_extruder_3.def.json @@ -19,7 +19,7 @@ "default_value": "\n;start extruder_3\n\nM117 printing...\n" }, "machine_extruder_end_code": { - "default_value": "\nM104 T3 S160\n;end extruder_3\n" + "default_value": "\nM104 T3 S120\n;end extruder_3\n" }, "machine_extruder_start_pos_abs": { "default_value": true }, From bcd93522a2cf73dbe2a49ca98ce10b4eb20684f0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 13 Jul 2017 08:44:42 +0200 Subject: [PATCH 281/379] Use bool instead of str for default_value of fill_outline_gaps CURA-4023 --- 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 e4252fbc67..d48581b250 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1139,7 +1139,7 @@ "label": "Print Thin Walls", "description": "Print pieces of the model which are horizontally thinner than the nozzle size.", "type": "bool", - "default_value": "false", + "default_value": false, "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, From 6cae41376618abd72c38b528ecbf6aed0e3caaeb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 13 Jul 2017 08:58:39 +0200 Subject: [PATCH 282/379] Treat initial_layer_line_width_factor as a percentage instead of factor CURA-4036 initial_layer_line_width_factor is a percentage ranging from 0 to 100, so when calculating the prime tower position, we need to divide it by 100. --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 81cf9efd91..b86e29c2d7 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -70,7 +70,7 @@ "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - (extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0))) - 1" }, + "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - (extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0))) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, From 5ad4c580550b7a01e640b45e241303db58383a88 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 13 Jul 2017 12:42:58 +0200 Subject: [PATCH 283/379] Take travel avoid distance into account with prime tower position Otherwise you can't print if platform adhesion is off. --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index b86e29c2d7..18fd6b2c1e 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -70,7 +70,7 @@ "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - (extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0))) - 1" }, + "prime_tower_position_y": { "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' 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'))) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, From 549e2c12c8fc5a66c7fab2e71e3de294f3c33501 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Jul 2017 11:39:10 +0200 Subject: [PATCH 284/379] Calculated values now show calculated instead of a formula CURA-3385 --- resources/qml/Preferences/ProfileTab.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/ProfileTab.qml b/resources/qml/Preferences/ProfileTab.qml index 2c3bb0a2eb..f31082f2e2 100644 --- a/resources/qml/Preferences/ProfileTab.qml +++ b/resources/qml/Preferences/ProfileTab.qml @@ -37,7 +37,7 @@ Tab anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right - text: styleData.value + text: (styleData.value.substr(0,1) == "=") ? catalog.i18nc("@info:status", "Calculated") : styleData.value font.strikeout: styleData.column == 1 && quality == Cura.MachineManager.globalQualityId && setting.user_value != "" font.italic: setting.profile_value_source == "quality_changes" || (quality == Cura.MachineManager.globalQualityId && setting.user_value != "") opacity: font.strikeout ? 0.5 : 1 From b5d7ec5bd29f57ae960cdfbf86b62955e6b80e52 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 14 Jul 2017 12:51:20 +0200 Subject: [PATCH 285/379] Round fractional widths and heights in system-themed qml --- plugins/3MFReader/WorkspaceDialog.qml | 50 +++++++++---------- plugins/ChangeLogPlugin/ChangeLog.qml | 4 +- .../MachineSettingsAction.qml | 2 +- .../PerObjectCategory.qml | 2 +- .../PerObjectSettingsPanel.qml | 6 +-- .../UM3NetworkPrinting/DiscoverUM3Action.qml | 16 +++--- .../UMOCheckupMachineAction.qml | 16 +++--- resources/qml/AboutDialog.qml | 8 +-- .../qml/DiscardOrKeepProfileChangesDialog.qml | 6 +-- .../qml/OpenFilesIncludingProjectsDialog.qml | 2 +- resources/qml/Preferences/MachinesPage.qml | 16 +++--- resources/qml/Preferences/MaterialView.qml | 10 ++-- resources/qml/Preferences/MaterialsPage.qml | 14 +++--- resources/qml/Preferences/ProfileTab.qml | 8 +-- resources/qml/WorkspaceSummaryDialog.qml | 24 ++++----- 15 files changed, 92 insertions(+), 92 deletions(-) diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index 72f1f950f0..05941530ca 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -87,18 +87,18 @@ UM.Dialog { text: catalog.i18nc("@action:label", "Printer settings") font.bold: true - width: parent.width / 3 + width: (parent.width / 3) | 0 } Item { // spacer height: spacerHeight - width: parent.width / 3 + width: (parent.width / 3) | 0 } UM.TooltipArea { id: machineResolveTooltip - width: parent.width / 3 + width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 visible: manager.machineConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?") @@ -122,12 +122,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Type") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: manager.machineType - width: parent.width / 3 + width: (parent.width / 3) | 0 } } @@ -138,12 +138,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Name") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: manager.machineName - width: parent.width / 3 + width: (parent.width / 3) | 0 } } @@ -160,18 +160,18 @@ UM.Dialog { text: catalog.i18nc("@action:label", "Profile settings") font.bold: true - width: parent.width / 3 + width: (parent.width / 3) | 0 } Item { // spacer height: spacerHeight - width: parent.width / 3 + width: (parent.width / 3) | 0 } UM.TooltipArea { id: qualityChangesResolveTooltip - width: parent.width / 3 + width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 visible: manager.qualityChangesConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the profile be resolved?") @@ -195,12 +195,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Name") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: manager.qualityName - width: parent.width / 3 + width: (parent.width / 3) | 0 } } Row @@ -210,12 +210,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Not in profile") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings) - width: parent.width / 3 + width: (parent.width / 3) | 0 } visible: manager.numUserSettings != 0 } @@ -226,12 +226,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Derivative from") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges) - width: parent.width / 3 + width: (parent.width / 3) | 0 } visible: manager.numSettingsOverridenByQualityChanges != 0 } @@ -248,18 +248,18 @@ UM.Dialog { text: catalog.i18nc("@action:label", "Material settings") font.bold: true - width: parent.width / 3 + width: (parent.width / 3) | 0 } Item { // spacer height: spacerHeight - width: parent.width / 3 + width: (parent.width / 3) | 0 } UM.TooltipArea { id: materialResolveTooltip - width: parent.width / 3 + width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 visible: manager.materialConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the material be resolved?") @@ -287,12 +287,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Name") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: modelData - width: parent.width / 3 + width: (parent.width / 3) | 0 } } } @@ -315,12 +315,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Mode") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: manager.activeMode - width: parent.width / 3 + width: (parent.width / 3) | 0 } } Row @@ -330,12 +330,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Visible settings:") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings) - width: parent.width / 3 + width: (parent.width / 3) | 0 } } Item // Spacer diff --git a/plugins/ChangeLogPlugin/ChangeLog.qml b/plugins/ChangeLogPlugin/ChangeLog.qml index 6d679ffe29..c9d3eb32ba 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.qml +++ b/plugins/ChangeLogPlugin/ChangeLog.qml @@ -11,8 +11,8 @@ import UM 1.1 as UM UM.Dialog { id: base - minimumWidth: UM.Theme.getSize("modal_window_minimum").width * 0.75 - minimumHeight: UM.Theme.getSize("modal_window_minimum").height * 0.75 + minimumWidth: (UM.Theme.getSize("modal_window_minimum").width * 0.75) | 0 + minimumHeight: (UM.Theme.getSize("modal_window_minimum").height * 0.75) | 0 width: minimumWidth height: minimumHeight title: catalog.i18nc("@label", "Changelog") diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 897fb2a051..93053386fc 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -70,7 +70,7 @@ Cura.MachineAction anchors.top: pageTitle.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height - property real columnWidth: Math.floor((width - 3 * UM.Theme.getSize("default_margin").width) / 2) + property real columnWidth: ((width - 3 * UM.Theme.getSize("default_margin").width) / 2) | 0 Tab { diff --git a/plugins/PerObjectSettingsTool/PerObjectCategory.qml b/plugins/PerObjectSettingsTool/PerObjectCategory.qml index d248d24bee..be7af3256d 100644 --- a/plugins/PerObjectSettingsTool/PerObjectCategory.qml +++ b/plugins/PerObjectSettingsTool/PerObjectCategory.qml @@ -22,7 +22,7 @@ Button { UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter - height: label.height / 2 + height: (label.height / 2) | 0 width: height source: control.checked ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_right"); color: control.hovered ? palette.highlight : palette.buttonText diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 878eaddae5..a306dd1540 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -110,10 +110,10 @@ Item { Button { - width: UM.Theme.getSize("setting").height / 2; - height: UM.Theme.getSize("setting").height; + width: (UM.Theme.getSize("setting").height / 2) | 0 + height: UM.Theme.getSize("setting").height - onClicked: addedSettingsModel.setVisible(model.key, false); + onClicked: addedSettingsModel.setVisible(model.key, false) style: ButtonStyle { diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index f9af47fc7a..79a2b377a6 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -114,7 +114,7 @@ Cura.MachineAction Column { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 spacing: UM.Theme.getSize("default_margin").height ScrollView @@ -200,7 +200,7 @@ Cura.MachineAction } Column { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 visible: base.selectedPrinter ? true : false spacing: UM.Theme.getSize("default_margin").height Label @@ -218,13 +218,13 @@ Cura.MachineAction columns: 2 Label { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Type") } Label { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 wrapMode: Text.WordWrap text: { @@ -249,25 +249,25 @@ Cura.MachineAction } Label { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Firmware version") } Label { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 wrapMode: Text.WordWrap text: base.selectedPrinter ? base.selectedPrinter.firmwareVersion : "" } Label { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Address") } Label { - width: parent.width * 0.5 + width: (parent.width * 0.5) | 0 wrapMode: Text.WordWrap text: base.selectedPrinter ? base.selectedPrinter.ipAddress : "" } diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml index 6832883c79..5a1f8f26a7 100644 --- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml +++ b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml @@ -13,8 +13,8 @@ Cura.MachineAction { id: checkupMachineAction anchors.fill: parent; - property int leftRow: checkupMachineAction.width * 0.40 - property int rightRow: checkupMachineAction.width * 0.60 + property int leftRow: (checkupMachineAction.width * 0.40) | 0 + property int rightRow: (checkupMachineAction.width * 0.60) | 0 property bool heatupHotendStarted: false property bool heatupBedStarted: false property bool usbConnected: Cura.USBPrinterManager.connectedPrinterList.rowCount() > 0 @@ -166,7 +166,7 @@ Cura.MachineAction Label { id: nozzleTempStatus - width: checkupMachineAction.rightRow * 0.4 + width: (checkupMachineAction.rightRow * 0.4) | 0 anchors.top: nozzleTempLabel.top anchors.left: nozzleTempLabel.right wrapMode: Text.WordWrap @@ -176,7 +176,7 @@ Cura.MachineAction Item { id: nozzleTempButton - width: checkupMachineAction.rightRow * 0.3 + width: (checkupMachineAction.rightRow * 0.3) | 0 height: childrenRect.height anchors.top: nozzleTempLabel.top anchors.left: bedTempStatus.right @@ -205,7 +205,7 @@ Cura.MachineAction anchors.top: nozzleTempLabel.top anchors.left: nozzleTempButton.right anchors.leftMargin: UM.Theme.getSize("default_margin").width - width: checkupMachineAction.rightRow * 0.2 + width: (checkupMachineAction.rightRow * 0.2) | 0 wrapMode: Text.WordWrap text: manager.hotendTemperature + "°C" font.bold: true @@ -227,7 +227,7 @@ Cura.MachineAction Label { id: bedTempStatus - width: checkupMachineAction.rightRow * 0.4 + width: (checkupMachineAction.rightRow * 0.4) | 0 anchors.top: bedTempLabel.top anchors.left: bedTempLabel.right wrapMode: Text.WordWrap @@ -237,7 +237,7 @@ Cura.MachineAction Item { id: bedTempButton - width: checkupMachineAction.rightRow * 0.3 + width: (checkupMachineAction.rightRow * 0.3) | 0 height: childrenRect.height anchors.top: bedTempLabel.top anchors.left: bedTempStatus.right @@ -263,7 +263,7 @@ Cura.MachineAction Label { id: bedTemp - width: checkupMachineAction.rightRow * 0.2 + width: (checkupMachineAction.rightRow * 0.2) | 0 anchors.top: bedTempLabel.top anchors.left: bedTempButton.right anchors.leftMargin: UM.Theme.getSize("default_margin").width diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml index 8c2d982b1d..a3748b0d4a 100644 --- a/resources/qml/AboutDialog.qml +++ b/resources/qml/AboutDialog.qml @@ -22,15 +22,15 @@ UM.Dialog Image { id: logo - width: base.minimumWidth * 0.85 - height: width * (1/4.25) + width: (base.minimumWidth * 0.85) | 0 + height: (width * (1/4.25)) | 0 source: UM.Theme.getImage("logo") sourceSize.width: width sourceSize.height: height anchors.top: parent.top - anchors.topMargin: (base.minimumWidth - width) / 2 + anchors.topMargin: ((base.minimumWidth - width) / 2) | 0 anchors.horizontalCenter: parent.horizontalCenter UM.I18nCatalog{id: catalog; name:"cura"} @@ -44,7 +44,7 @@ UM.Dialog font: UM.Theme.getFont("large") anchors.right : logo.right anchors.top: logo.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height / 2 + anchors.topMargin: (UM.Theme.getSize("default_margin").height / 2) | 0 } Label diff --git a/resources/qml/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/DiscardOrKeepProfileChangesDialog.qml index f3c790e416..74b313a6b5 100644 --- a/resources/qml/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/DiscardOrKeepProfileChangesDialog.qml @@ -109,20 +109,20 @@ UM.Dialog role: "label" title: catalog.i18nc("@title:column", "Profile settings") delegate: labelDelegate - width: tableView.width * 0.4 + width: (tableView.width * 0.4) | 0 } TableViewColumn { role: "original_value" title: catalog.i18nc("@title:column", "Default") - width: tableView.width * 0.3 + width: (tableView.width * 0.3) | 0 delegate: defaultDelegate } TableViewColumn { role: "user_value" title: catalog.i18nc("@title:column", "Customized") - width: tableView.width * 0.3 - 1 + width: (tableView.width * 0.3) | 0 } section.property: "category" section.delegate: Label diff --git a/resources/qml/OpenFilesIncludingProjectsDialog.qml b/resources/qml/OpenFilesIncludingProjectsDialog.qml index c817b03541..3c7275a2a4 100644 --- a/resources/qml/OpenFilesIncludingProjectsDialog.qml +++ b/resources/qml/OpenFilesIncludingProjectsDialog.qml @@ -59,7 +59,7 @@ UM.Dialog anchors.right: parent.right spacing: 10 - Text + Label { text: catalog.i18nc("@text:window", "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?") anchors.left: parent.left diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index 11e82ea054..4a62027f66 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -66,7 +66,7 @@ UM.ManagementPage visible: base.currentItem != null anchors.fill: parent - Text + Label { id: machineName text: base.currentItem && base.currentItem.name ? base.currentItem.name : "" @@ -146,34 +146,34 @@ UM.ManagementPage property var connectedPrinter: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - Text + Label { text: catalog.i18nc("@label", "Printer type:") visible: base.currentItem && "definition_name" in base.currentItem.metadata } - Text + Label { text: (base.currentItem && "definition_name" in base.currentItem.metadata) ? base.currentItem.metadata.definition_name : "" } - Text + Label { text: catalog.i18nc("@label", "Connection:") visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId } - Text + Label { - width: parent.width * 0.7 + width: (parent.width * 0.7) | 0 text: machineInfo.printerConnected ? machineInfo.connectedPrinter.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId wrapMode: Text.WordWrap } - Text + Label { text: catalog.i18nc("@label", "State:") visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId && machineInfo.printerAcceptsCommands } Label { - width: parent.width * 0.7 + width: (parent.width * 0.7) | 0 text: { if(!machineInfo.printerConnected || !machineInfo.printerAcceptsCommands) { diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 39692a9f84..776c4c303e 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -16,8 +16,8 @@ TabView property bool editingEnabled: false; property string currency: UM.Preferences.getValue("cura/currency") ? UM.Preferences.getValue("cura/currency") : "€" - property real firstColumnWidth: width * 0.45 - property real secondColumnWidth: width * 0.45 + property real firstColumnWidth: (width * 0.45) | 0 + property real secondColumnWidth: (width * 0.45) | 0 property string containerId: "" property var materialPreferenceValues: UM.Preferences.getValue("cura/material_settings") ? JSON.parse(UM.Preferences.getValue("cura/material_settings")) : {} @@ -53,7 +53,7 @@ TabView flickableItem.flickableDirection: Flickable.VerticalFlick frameVisible: true - property real columnWidth: Math.floor(viewport.width * 0.5) - UM.Theme.getSize("default_margin").width + property real columnWidth: (viewport.width * 0.5 - UM.Theme.getSize("default_margin").width) | 0 Flow { @@ -115,8 +115,8 @@ TabView id: colorSelector color: properties.color_code - width: colorLabel.height * 0.75 - height: colorLabel.height * 0.75 + width: (colorLabel.height * 0.75) | 0 + height: (colorLabel.height * 0.75) | 0 border.width: UM.Theme.getSize("default_lining").height anchors.verticalCenter: parent.verticalCenter diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index b4ee4d5c49..0f51c121fe 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -53,21 +53,21 @@ UM.ManagementPage Row { - spacing: UM.Theme.getSize("default_margin").width / 2; - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width; - anchors.right: parent.right; + spacing: (UM.Theme.getSize("default_margin").width / 2) | 0 + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right Rectangle { - width: parent.height * 0.8 - height: parent.height * 0.8 + width: (parent.height * 0.8) | 0 + height: (parent.height * 0.8) | 0 color: model.metadata.color_code border.color: isCurrentItem ? palette.highlightedText : palette.text; anchors.verticalCenter: parent.verticalCenter } Label { - width: parent.width * 0.3 + width: (parent.width * 0.3) | 0 text: model.metadata.material elide: Text.ElideRight font.italic: model.id == activeId diff --git a/resources/qml/Preferences/ProfileTab.qml b/resources/qml/Preferences/ProfileTab.qml index 2c3bb0a2eb..a03ff7abb3 100644 --- a/resources/qml/Preferences/ProfileTab.qml +++ b/resources/qml/Preferences/ProfileTab.qml @@ -51,14 +51,14 @@ Tab { role: "label" title: catalog.i18nc("@title:column", "Setting") - width: parent.width * 0.4 + width: (parent.width * 0.4) | 0 delegate: itemDelegate } TableViewColumn { role: "profile_value" title: catalog.i18nc("@title:column", "Profile") - width: parent.width * 0.18 + width: (parent.width * 0.18) | 0 delegate: itemDelegate } TableViewColumn @@ -66,14 +66,14 @@ Tab role: "user_value" title: catalog.i18nc("@title:column", "Current"); visible: quality == Cura.MachineManager.globalQualityId - width: parent.width * 0.18 + width: (parent.width * 0.18) | 0 delegate: itemDelegate } TableViewColumn { role: "unit" title: catalog.i18nc("@title:column", "Unit") - width: parent.width * 0.14 + width: (parent.width * 0.14) | 0 delegate: itemDelegate } diff --git a/resources/qml/WorkspaceSummaryDialog.qml b/resources/qml/WorkspaceSummaryDialog.qml index 3a66d04625..5f8b7cce51 100644 --- a/resources/qml/WorkspaceSummaryDialog.qml +++ b/resources/qml/WorkspaceSummaryDialog.qml @@ -95,12 +95,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Type") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: Cura.MachineManager.activeDefinitionName - width: parent.width / 3 + width: (parent.width / 3) | 0 } } Row @@ -110,12 +110,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Name") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: Cura.MachineManager.activeMachineName - width: parent.width / 3 + width: (parent.width / 3) | 0 } } @@ -142,12 +142,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "%1 & material").arg(Cura.MachineManager.activeDefinitionVariantsName) - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: Cura.MachineManager.activeVariantNames[index] + ", " + modelData - width: parent.width / 3 + width: (parent.width / 3) | 0 } } } @@ -170,12 +170,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Not in profile") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", Cura.MachineManager.numUserSettings).arg(Cura.MachineManager.numUserSettings) - width: parent.width / 3 + width: (parent.width / 3) | 0 } visible: Cura.MachineManager.numUserSettings } @@ -186,12 +186,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Name") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: Cura.MachineManager.activeQualityName - width: parent.width / 3 + width: (parent.width / 3) | 0 } } @@ -214,12 +214,12 @@ UM.Dialog Label { text: catalog.i18nc("@action:label", "Visible settings:") - width: parent.width / 3 + width: (parent.width / 3) | 0 } Label { text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(definitionsModel.visibleCount).arg(Cura.MachineManager.totalNumberOfSettings) - width: parent.width / 3 + width: (parent.width / 3) | 0 } } From dee09e15aed7ff4924188130ef9927cc262fcabd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Jul 2017 12:59:39 +0200 Subject: [PATCH 286/379] Added 101hero platform, based on pull request from rmcolbert CURA-4046 --- resources/definitions/101Hero.def.json | 1 + resources/meshes/101hero-platform.stl | Bin 0 -> 241184 bytes 2 files changed, 1 insertion(+) create mode 100644 resources/meshes/101hero-platform.stl diff --git a/resources/definitions/101Hero.def.json b/resources/definitions/101Hero.def.json index f6e920c8d4..205696c450 100644 --- a/resources/definitions/101Hero.def.json +++ b/resources/definitions/101Hero.def.json @@ -13,6 +13,7 @@ "0": "fdmextruder" }, "file_formats": "text/x-gcode", + "platform": "101hero-platform.stl", "supports_usb_connection": true }, diff --git a/resources/meshes/101hero-platform.stl b/resources/meshes/101hero-platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..cd6f63c83c189f229da9ca23668a2d3d5bd89358 GIT binary patch literal 241184 zcmb@PXIK->7w88B8}^31!E5hI6iBjURTK-N0u}`9V(%S@9Yu-_5K#fKS5UIFO*T6= zR0LGSE-Lok6-Bux8{g-D_VwOxmrwg-&hMNvWv85(S-gAqYySW9udo&&t@e**Xf12T zdvzqg=lv17t#lcsb!r=T%{fT>1gxfAzDFAqmmR0)2G6IqQ=b|Mxm~+D*ROC5N5~4H z)!HRA#KMz0)~jvA^p9
F*Z4v`^jIK#UvWCv=$d%TRK?gjelJruMl@XbRX^R5OLH zskMlf2fcSr9iX;LHqsjbCL0@k#|w3)zg4?M)Y2a;Os30H=1X2(7?DiJ44qHw0)c5l z#?qloczP|S`-TBZ>9b182lf}!azfLjDYy9X-$c5K zrzeYhQ%}fks<4n&oSG>**EiYle_N)`-|H*Xf5`JVWk^VgXnj82m{%HY9P_M16jHN{ z!3|ABrOaBKU7Zb*SHsVap%KD9TV?E1fK;8MWe5~Ao-jk`4AZ?ACuW15hrQ_BpS?)x%Jn{IW+Z3z>0 zQCr15XYPxhPzr?H{8^v-5VP*Dd|==EOx`A5$ha@Al=9Kp=c#U&&ZAe($Gm zGuP6^eYgLIm?{)HZ}_bhS~(og9CdOgP3jav*K_@NcZ+%SWS0=B&aX9{Nn<;N&`DBj z|In)*Q@6xjSUs($s*3*tdh${TeIC`1e-^fgelJ{4dw>+C37J$nlNq=+%h1E7m5RN) zm{us;K)0{$$4?otgx+nuk#+zA(}cY3TgZ9MyC&saEC`})9d^)I$j52Ak~U}(O%K6y zWXT#@M~wW_+MOrns6*1GF?|DD18pSft-l*9m%|ITv6Dw)?bf_Ikr%nJIwtDrV06^8ZERxU@e@F zzN*B%5AJaiI~<@xZ*8PQz(YcubNrZ1_ND5e9>rOkuIp&CPs^oNQhm`;S|v1sb_S_K zc{+N?J&?YX`YY{~)`~{Teo|TC6uZ<6nypNiO! zi7!^`JJ01GISBMk#dQ*a^htCb1@w^GQEA|@SD3(>2nme!aJcgMyHr-#D@@CY z=^d}@mrf66KDKY7$0^totcehtfD48uZy%^P8Qle3?l`xYCL~|eh3l{DG$Fz!U#7~fGWFQu)%EsMboA`nt#mt-E+*U@IQkvl+Iv6~^038Brp0rk zTA8BF!UUG`@2#Whr?=9}62Xq@&s}^MEqP^XC3~Qi{Du@Pg=sq+_5P@~S}{&|RQfUN`rdPNU7exy6SUEP zCY+&jg4}6G=uyvDouPeMcWNVz1~E%ks6LF=3ck@5^aGvr^k{ikIt-+ye&gw_y{^&> zsY$efTHbP%Mg~Hfj~LH9nEKXGc}HUzfoB<*CS*!U026iZs^Q&0M&D;DPoGX>=}54F z32d7X%U5HWYXd*4PpmztTqlZjQtQsN=a%g<0&5~9wRD;g>v+b{Xy8@V*|rbG&Kp*V z6?Q}$1K-{hZEZJ;S7AhsSoT^x_QhSC+dl@{mG-Ke@MTCNq4U#x6_(=1=8G*B#EUBn zqK$ZLC*=2sGDEY2zCvWD1N?5wSoYKO<@5y1akf{AWnVikrw1dWjaL`$W9!3sZu%X@ zk9WOT+}0GChCQt)~$ZF{kxJ;q0?#>N$5sWu?V?S#`6GbP=TFls~|(zP6TD z&5toU#q4FzjDgW-`cts+eV;Ao>AhC6G27k4r3TD0EMa!Hx%me63wSsa=!Uarv3Kf* z(2LT%q-y8Vn^3v|q-F)By7d3GgEoP=9U@bX%(g(dM9u*io^TqVP_Lxh*{(`kgX4Vxte}AxOF5RNWzQXD& zgwf7_ti)bnsr#=V(zI3Y#QRmzc|&`vnS!ENryqCe8r^m1v6PRjPgkiy{aADZ z8!t2S=*7mbq~8fSab})y(JS6icw^mjkuP54iPxXwOnKz25*SlON~0Ya-3=)6aLX@7V&Jj|wZF4)m%sc)YZ zF-s^HpP{zsJ%z^vmRdF>n||Nfg02Lbkh4M7yfS!$a{FhkfIX>VdzxC$YDZm9#~3&L zNTu>?(h+mL=qAuaNS8y|Dr;p| zL*}DpLUQglTG?$8jn~8&ORL6GyC%!&9H$uL3S9y{(RC#)=xQRuk9SaRTY7^VQ>qoP zuK(J&+jTTuA=&7ix>mg->6u~Kz|k@rCi-6~OcSzxWdAg$o99%17lQ?dTiaO9eGxt8 z8Dk8dlBAiLwS-=ToMUeZahTmYbDc}RwT07|ATCeo*LOYpV0Q$Kg)!B!PY8Q=euN|?Cw4qXl=q-wCnk?8gKR z|83~~WQPvx!gN*86aktRNHYM3&83D#5q^w5RMK75lJ^gO6!s}>*|Oyuq;%A;yvpwY9%;j#NudnX2V2kiYI*z-Oe^Wm_!4l z`nWR6j~T}OQr8ncWj)^>!%neElKjO4_7>*U{ezh6uPh9;)SFc}1ruANqS@IAyJ*u_ zrkod7VVLrh+X)GVBbhj5QMv8x({ekdmXYePoh`Z?N2AIO0wQwASas&Er2==OrV6KE z!urz=c4(J4`lPmr*k;vGk=Za*D%}On8EnDmRdmO^!Ln9jnjzPN*0Xb_iBN8Dt|&Lf z+^%q2>g+p}b#`7ad9vo`EVfJ8I;n*cVpn=ueQV4#!Ro@5EG&g*#d4zZ%^T|8Edzv< zt=F6}5pzF){XKTQlygiIlGQ4JsZrsEVfNUXdQ9LsHKqyKq*}%(evMF{`o`-_QtM&n zZE9EZPfuZgUJs{Bp`I}fGvwQinTJCMFs&?8IFnQfNCjUU$kV79?A+8yiNG|}#~&Lf z!3HL<6t+!B#}oAx@8)|-^??a2h2I-OJchJp+J$MD8{2BC@SF2rum1IxkPBK{Mb+fp zf7!r#u_i(~%*|32y$)vfbxFy@Zz{GSC+wpN^~cr+F+HYas4#(h228_REn%?Ga*8cu zH)692_a(UZ!8G&?W7>1{@oed>#ZnCmg4n|_`k3BYIbpf=qt5@MqeNgS?1`MnFRsfy zD~bP$c)w;9+t_}))EmgxY8|?WQtxvu|E>e>mxeSePZiMPm?F@)k0E6Kvqas)4GEHs z{6Of}TW*nN-hGs7>ANA3QXE!4Y%T46KZ<^bSPhJvQ=4&6M{Ew+T#R)kz(W0^@kHJR*FsrY*PYg?Y!s6qET1Q72RM z6i0_mzeg>K`xA}Y`}?52!;fHL-&Gquj>_U_EspgPa_q=l?oO+PQa-A>B}24plN5ox z9($BF85BX!LMaS+evJCtZ<3;hg!pDH6)gJssvqrcEsMS4cq@+F67q6VE!~{)<{c9p zhx3`9M)&VoLm9{uj zdNv52)$km4v@b7@su}OjXN2rH^^AcPxun;-=$z<1bb2*c-t;^Vo=vg0cb|9D($VqM zrn4y`{3B&5Q~Bg&L)qqSdYqz)+)X#Z*!LEQm4|lGCsTLQ)%{FFyV@7jt)5I1TwQ|o zIAuCWq-~C)<)L&F@9dySinu>f=cIX;46VOU6>d~Nq{k@>$quUM5J#&4v2jQYoiFaB zb^#_E%A$qBkO$$0dhd#PoT64n(`Mxpq)2K2V66p26>cisxGG@owfrfT*EtR-FIv@hq4a|_I zwdY!-nfDFw+li$xO-R-3CfuXW<~STCu#~)A9n@>M3qz@tb1a4PBq!oNebB`oHOByO z3MOzFLVTCGslIFzz?8STBx}34L@^DqrNJfYtKIyWUhlnC#^G`FbfvvgYyU6t?^^)T z!6h{nYgMZhrui-=OnU#7!fzKLpI_AGMr8Z{Rp;0SZasv|t7Fe~^4lm8N8-b1RHdD? zAGGiW|AbP@Z9ApCn?0~Yw`Ea+^!^j_+=4KAh@jWHv_pZV0>f5OMc3`pD6<@%yTP+* z-w^u5@WEUIUvn>t$D&?2E9tM~C~5`q3rrKz->%f45&W3+!Fzc;7Wr%srB7?e(#O#6 z;;{>Q(b#3&kagyrYAn_CMi_nYC649+fkz@}i31J z(}OqBNiYtY>=E*MY@qNVp}l(M&Bqy-z*0)>CVJ>@l(gSQ$nkRl!c5x&^`NQtdi*}) z_gwzg-aJ&5o0L32st+uMYfVmkS$|t$@E+OAv}(aMg$b;QkO?2=3g?^-7=l$jmAJn; zuslZUIqN|w$O-oML&Nq_lY}1r?s`n%J`vM!%A#8<^`?!1!o|{LCGJIWzl&)?hTrJI z3=Quk9GN^(g?nn;GhiC#)az<vNfM@ zXT@ET4Lq~J1l9y=XUkDsr4G~nB5?U&nh@K^A-cMev40V`4lqr~S8Bx-T-+=XxXv+w zy(NUv_2zE;A#fYTw47LJvs3p$XWpB@Zw`K=aLb2?aMU7$`{E@+pY!#yp81E;z%4uJ zHF$Gyzk+E(>b0;Ix*rC8DOfMoM97s;A0gvNIl;~+ zp%<=OOkhnAZ~tn|os8)xd4>B#EG2JOmJVsUlg0HU0^7j-E^cq|uFk8&{Ys6I2)xd~ zD;D`^urYcJQo^EC9m*! zhtJ92^D~6Z@|w-;TBI|$zl`NEfyY5i6T){|$W-XP)o`YAVh>E<)`w|Aj6!{`-7)hH z7H)l*mU}guRN=zzACU5a+Y+Ybgl=Uc?s>TRh;PF|E&E)!Q!ZtEn{Lt>}4v5Z}bQrlwMp5^>_AC}YC*mM(oqThL=lQ*7zp zoaf5l=e3OJ_?5>g_3bwrueY?Iv!6#B{SWLhZVM!TB3@5d>{NTX%xB1+C3>8~Rjeu6 zf{of><6vN4u>sgNN7asJb!KWba$?f6Ht=Vh_lpm<7{!@C2l99~BYi-MIESQ(VGm6E zA7{fFE6DT(3ey~ptzIbh57mk$fAN_Btcj3=?$a1YdRg6d?^7NV_upI>8=qVy7A}i6 zzV7fyTo^xCTzto5!#QL&<6o4l?wq|q>T+h`ARbFuu6`$$UECpbZ)@61{l30|V!PKGiNL$8n5I6-VnWPFc3hpIKq#7& zIy|qq;V%O3xDIwYLDluQi7g+Rc3-V4R~Mc|3>UiIk5J*18965)*1AoMg#B8N(?_X+ z?)XDoJ+?qN_9V(Mci3Ydr|chcl+Js#TMPkW(BmWYcgy{Mc6e{JpDEbI8PpvrPt@a- z6o;eI?(}RR`jBHZt7D4TJ=x^dsxMWA^om~0_%2)~PVv5YoUVf%aMMmT-Wez4P_4S$ zlt}X_)|0Q`Jj}4hv-9&kKI^9!3(4x%`%Y}4t)g~ehP{7%TTlm5(|&)?PK7l_=T z8JV;~z-93@q_nxMr)R}fvB$Kh##ZpGgXgMX59ZXBPO0}6&Stv2xX$5}hpOG*r?xiI>u&|IIe19ONZn7v(l>t00H>WC&Mo#3=Z}!RP*yQe zR`I=_%gPFuF4jbd+EvTV4;jsw=84#=ts76%VT107N#GUskdW(@MhS|26@(kkDN4LY z|D<<5b(#HK)Bu6^>j`;mmtjyYgG>Vf{lBfZ_*dN zy3;17Yl2s;2KxvT@0DYQ&wS0}vk~h$+@dkx9q2*Ne*8Z*Z_;^ByZ zQ*|}-;#9Axlcci3CpoZ(*fz{E z29&CH-Vb8#D;mhW!ZxrbXuHjPnTwwZGjzZR-jge!ReCx~(d-&txzsLhh!m%m6AuUd zGNiZnV>+*N(&KW+_0b|Fmu~QHOD9VwAPzkmER4ywWvp_Vsqh&VeCh?CXMwnAnpW8O zL!rF6)k%fV$>28?(}c86$@o}SDn$}n?&Fg>YL^m!q2q*E@@4u!EUwNaR#v)!Fmg_Sk<$X|Mm|P)1Mv_- z0i&N#4(9_CxSj|}nqkLT?V0gc&asD>CdA5cSvRZqOo_lLn2_hg^=VhmzNvZ6fXfQ! z9G4r+$li<=5|3C3zb@3|@!a6zOFf;Fnk&|Yoa0fOkOSqNxlX0#6(lC`3;@#*3s3fC zDwUS0ce^?%acjo}Zut<)m_435bir%`>%s)qL`dj4mdm|YB9#>;u$26b`tsRVX!82E zA#PGUk8_A={B{x2wnioH(roj35U1dJ#+u;NKT22VN&g;GnD3A!;b}=m{dNzKn>J$*nw0*SLY0I;7 zwCa)O(%C`WpW}4`?COuXo?7_X{6^svOkmrvj&iHTt(#N=S({gZnRm`oiKTEo%Za3w9^Bq^^Xd*u;n^}SLqgo!S#dLFoA*-j z3GAyqa%q0^q4Xl`{K(H!50BraKlUM5s9(@WkI!b~Gusj6@~Eo%a9UZKksabXV1{1ioW15gQ?kl*=%r6pwSM)efc&!dm&brG4&F4{S zMU`DVwt)$(3Eo;Dl0S`7PqUE|SPFYcNUc$8xNiG;O7(&D;<}N0_3mbKE?F2L5jX`C zc;yZK?x3N}o3XW-8=|WcOX1chCm#D}slH_gGZ|+p$X4_?wjd{LGZzUhwysql`#oMp z;8+HZQV0&8dgK}a@s)F;hGxxi)ULQq`WSU5i zx3ez|~M@Z1Z6AnN9A{C~c2Ap$D%ZanS z7jna^nd3g#UmTOe_Tc{Dx9A@JUk^)Vg`;(tz?$I9#MuQ*_@^kt%yWLuIHrf`z=A^B z)bo{SzKP^qzA4vgLo3M!j!oi-C#GSK<=#wYXU{Cd9Ctqz)`g`o4Rzl7t9o_ku|k^O zL5~S6C6A=mxf7t^XPlBs7ZX?t-~S?{#eBOScGG%D1Wv)FfHlGUk)T$TIGJy_wYqbc zrg~JO@5=h|n82C{ncXqcVP;3OSD5&>K1>l>OvBDk+m4FvmnTVHVFI@dOv8?QvwDi6 zkS!8{+Z86TCWv^Q@)cUb^`gmlBGPdRZW&k;Ay45vQKAJA>a6N2BXIp=8qUK_Zl)O5 z#aveSejT0$}L!iBZ2YD?7$9>wRCAy#1%~);TiNnz-Ov{Nv#d&UPhJ{ogI8uc7hj2s( zYS77vJJYD*Uj){RX*m69-I(+AKQ0m2D@+8AaA{ zN5}8~t6ky!I$UnBqd4=u&Q`hnF9PqSVcK*aE}k>qnJ5wXwk+O{#55tAVXe4BpUrJo z7KcH5n^+UXugc=o7oW`&f+G&8@Xj&5!;ANa;m&9+tuSz0Deu>Nj|%Vb;yq!!+e^s9 z(k{Y)(>qz;F~W~wRvd64_d7iGHnNl zHCyJeM^;1|PoDA@*F4E$(_cp$=S}q&?W*Ol=Np*rL3VFGkFRm0vGV2@tuSG-igw>; z!=^dJ$_UM5f3bD#H1_ck)9p;R9U|{sP)oJxv{u0PPw}l*Tq3YyQ3Pc@vperJ8*VjX z0!v}raQ@2boU-`Tb{02@*>)}Xr{k-<7AG;Al(@a z9Tug!+#-c~E*C_`zr8dt>+n`4YRxSh!?8zJ6?yO!TV{l$8#LfN6grhNRfXt(oO zBW$L_H-7MKS$x+vJ>Z9!?iFr)3wL4(sT;#7twwCks{T$+V5x@Iuf>EdQ(Y46Bx3s| zUfirzW*2LP_tiMHpjTb8xG2d-M z4Gny|@tA18;hD&Z$6Z2`2J>UM{Sd#;?4! z!a4i9oWN4@uSU2fb#^Y=TO(@+v=aQC34BflpR$27sTCcZCu^rUd;f>PQuvz_5ZP|e zEBz{eaV~nT6>thB8l-27Wggqby)R5huz&D}seP?_RnvjLf$10n5 zi_R>7TiEy}G$vkc_7ZKfzlz`XnrvK4zN<_j#mY)~TH*EPmZC#2p~p|f7~geu5y#c} zAiiE7W5lPP;O2{W20vz1bNxeJD`cOa%06})L~p?T?4sB)tj}dPx?@|6vEuS?ntZrl zT_oMx{&J(H)9AOYm0?hW9_61&DS42xFfLRx_RC|jTJIQR?X6oitKq9$-=wc{W%$lk z2lmQWAFDTBz$w;l2U%h3YFg(|?0;-5Td+DSCAo_8FsKhq)VRDvGnqURAMA}bwtTf; zQ`jR{EZ@fTeu%3MI4vI&!B_pNmEDlW-~GUMpP^lKchN7@UeY(4A1pNJyp2usnolo5 zJ}`mrTEmU18Atf>w8R{fPb%b)I@%pTijPVsJ$!al#XkZNEAkl(`g$US7}v|=vP zAigR;u|&rRk>$m1g?)R*LSg=aCgakhxcUH7K-d~aSBt^;9kxlb|!oa>DQn^JeEp) zw41d&lpx&zhqVFhjB3ggp>x*VwDop}*#YpCBvYNw$UDKRk8PoMj}PLpCPJoP9>W+m zS_pY_E@$pJE3gqi*3o&>2J@qfIrdf4Xxc#-#JAreuqww8+DmHfl@GUIK6)_B++D-f z1*sXVK4>Lv3+)x(GPYl1VBHcJdacIt@W%=y>*h_^tU`a z;rm)zLz*qEuq?;b2sF=q{92~7mm5UTH2B^QwkIbV%<*C@`&4DF9@xd>d|=<_pEj^p zKd=3hk0W8R`n%P%j90C8dh8XJ!X6Uzw?e>ru@t5WdDkOX-Pmy&bDX)szaJv7E$*$Q z?;EBFSPI*QFMowCWIpl{>bNPa9_IrSSQFg4Yx+y)cF-In!=7LdfB#Hn@A+=~^JSya zD<=rn886j4^FC+c(#2B6ms45qh;7ohAqc6wFPPbRI8QZ?ThBjs&tQ`$1xx+aiFp~U z_##N^qj258%uBuds3`VV;jplJ$xG?T@lq z^&%zTac>8=uoFfyb22Ij_nZ0XvEJ~xCs^B}%~C%oxAD)3G0bFxh2S%HjWbTcgv;X- zY`HF*|CE)*>XOtM!^~&Za4(Ac+K#o3v0JKcroPgbrfLoyCH%ZoUYJ&?t3G$tF}CHG zO_DAwg=x5nG|OGs=wd6dbFTB4z*4vrU{5%c;HU4(Ovw%1@;a8G$$9-k3-K^u{J%9SdvlV_D{6t?Sd+uBn)`g`o4R=gZ zUaQ256?Zp9Sn%CxEQM)8&abM&h2@Qt z@_`8~h4TmF$C(a>B}%Cg}CJ z4scmv8g3$$&K1IQ_o;{MvsYoly=*sI;Y_^rB?L^vJGiJO=Nq$4$~o@aF@akstWw{& zaLp!EkO-^`6Ic`6yPHvwYZ$*&B5)~UT29nU^<`R@l^Mo5*OiSpc$C4K2q}e=PAh<@ z(0-KSzf%8x#Y0Yv-tDBY?l4uV4@}^4GZFvNgd7cCBs?ryV^}zFyB?30IOmv#uXtq7 z6lNaO8wUElcg94;L%Y}ua39(9g*QwS(sykI!n#2tWH#`4j%oPv@Xuykmlidp z(#0v5kk?>(Yr(jR8CO8{4=B=)C(0qx&HHB&16A|+3ST!MVgQrlm(T=Y= zTE`A~5JhcIbrW!(m_Ad-78Xa*b$v}IW!=8`GnKY{GxVPDPKieuJZCs*Ok;~?ME&VS zzw9d3y~{PXT|CNQT28!we@K00(p=$6hpRkJ!8U45=h$XX{cY9|dIs+>bwp+1xDjCJ8sz%=x`vuq8C?Sq7fKAm|?V6QL@^WE-FLW7f?gwf}> z=`n%zVsBypBlrp5zxgD6yjCkanaFM!mhES1fOyD z^q9aNVj9lY29IZ&wR&XOJ-ogFOJN$n1%wRR6v0jX-v6)n1HThk6Co)t_Z#lKn=5SY zb(+UgxJ2c|+0%Z)o&Kfj%pMan@QekI;dpG9moApVwTbN!QoC4{`_*rWHqR!t#>g-b;B z#60$VYMEH4YzRLHhzfB3$Eu5m?2Axv0^(OgRqe}KruVfT{I!x4_QgiH*VN2|e-d__ zz38M94G^au+Tl1m|9h%9vAPG?h;;784DjvA{Nyz%oPvqB(~q(Z+8+NyOwk83hxewa zatHO%;}mU+qipxrhsASXV`0mqZ0xTD@osCAja#+s6+^DAlJYU%&6yqk^QA`kK9pZs z=anX8*C-csyIe4;Er$ScfSoVISw^XA#TM&vO2zt*G!?fD7Ka~>HcqTk zsQJ1AhVX6CP#!;kaKTz`a8AH%yON))Y(opWei18hy$Yt+JzyIQm6Mxks}M_ggPv4)5Bf$M+!d&B=h88(khZw4j?e znIfq+k#p6x&n;n?Gb5exJxF|WQXU9J3JxO6VlYmi2dZ%AS(99x8VVzsyG!$&y+87<#AD*kG|GL#)yBc=$F@z%X-Lpv6OSVlj_QzX_@I6_jnuy#(9!^HU3+fdR&aJP_^$%9>=Ka>i|n(8piWq_FVlhQ>1o<30%6EhW{k+ zvP@l&;47pIzsBR5!UWa?-|?#dtS9?Y%UrUQ6Icqj9=Pv(v&;~alD8||mhc_| zoa=j2X4t>SS9tH4&EphI;CBV)iSJ6(lRf=~^g35$1eU_@4a~yxzo=s)#tJX$muBG< zOyIYRkf^sIYIXNT!m278Rrp=QZTyG>nEMhe zg>x<^2LG+sCU$jtmyEtS+gr6z&=1#IL5_e78$l;qt6TdQ9N= z5!3KSd0cbm-h}IGjnfJNtz0xaZ9a(JYhsMJr15wKvkak5W_d4beeZifpwSDLw7hh8 za1mMAJ{C$iMJLSjO3}2dk|q{biZMR)%h!CLA1?-9k2We#7&KRIaAGFxO~DsQ$G9n< z`sti)erN?e%3$Ado?s?(_@eW%&pBC(zy>C;CzysW*Y`Z_oO;WiU-wg<4@_W9Fmg`r zEUcL7#MsAf;qeRr=LydS;CzYuKw(I$hD`bF1F|^-o@HPfZnB;jDa^YCXV3W_vUy2l z(?U(RoK<42wJ}Ca!-{3@Mx_{4Nx$}rR=`p-Yd_TV(XJ8)=STmCXuD9u^isAK4iHB5 zpy;^fyy3iP+JnM%U_T;PvtVSBm?TB$$)E|$H@~NbCCAUGa0<3j@z6`n$k*Otr^cqe zqKcIlGi6(r81e^SQbpJJqB&quM~u52Z44+b(UhIaGF|~GIniEwMHg4wL+TR`uMcKF zM4S;XfK;y|BAeU4Gd&2;Jw6!Nv8^1bR3DgD^`)dNB=m^@olVJOe)(`qV3@$2PED`+>P^SHVNFP0-&8 z0jF5S=d(5A%^qS+gcKd_%VZ|D6vXiPN-X6ac9l))?M{bWapz^;lA%4f=s(rd3N77w z>M?<(^Tzx*mY`CK__T5Z4g$!F`XhHv4( zx)!g(VO4Z)F;gR=lUlD)8E{HK-(0p%%4cb{UH^M7>ka=&!n6v9yZYDE%&Nuhgh^X} zDRBxW5?rsajVC-6m-jaj^k`K@>65jl8f0>2?_dK@muc+#4d;_brLxP@cZruqddT7d zaG$eweQxP?^X&D-+5*=8@D}l8Q~35uH6!b~C`GIe&zBb*W83{)tZ|Y~o>f}XUJ*EV z!(TSMejH~lPizyDJUsZrT~4z78b*nq#+tlxyHs1@eR!QjU{A1za^hX|63+63Iqrk4 z*Xy6k=EUxlyfP6(z=p{~LY6*SDlA^+X9#dfb;33<@iY%g0lq*}26aQo={Lbbz#u#Q z@u>&(n7~rL!Kv)6ibuuaE~b2}SlU@oU2tTco}8=4DM#L)WGyD15_3T>j-$XAPaLhe zDl=wrrZ?)v?R{+On~UN^kg}Ve$u635S=7OE*b1JFaVZgJNM5~<^<|p8C{y3Fea}xT zNoCJWX-GZce?DM3JM<_U4}_gWbRO!=bZ*#DX#4Yo9!FA!h8<<+KG-SV2Ps@Pg!ITe zrr%UsD|ByHq`>8FbUeWdw%ergk(X}5Ol!R(e52vSbQ?X^^~It~NZk<~IH?pV`KG3tc{GPL1Eo zt_81duKb`$ayrQFhi5oDIG`anWt;iTcKMts>;^b{>eZ~a5ffMwyyxkKhLa&vn6A16 z{U-lcn$gwvuoFR7!w!!%-FGLlZ8=XKdkZ(Ja(f!ApDz=(tv;sTnc?ZOr0pF|zoSvc zUR*PcXQy0Eqp2ReSksP~Uvx)fiY>xd%qM?0eDL-Y$m={kmeSo?srj;t(^TN1jGMMc zYdj9`*O+^TjJAyMQ{6`R6>>$7Q?|E1qS@FmN^|R4l<{=)9L?k7!!_nU(eYl8(0bc% zebfaTeZ67tG`iGh>Tq3@5l08#G=Ht>dVZ?QR-I`z@#4|}=liaEvxdUy&plsWX$~B! zEPA($G2(eCjua9Sk#yZT{$AazS^pubuPxE^J(q4Q{S_^v;UwVfM*0J{*XR$pY6UFy z```{%8~aNvfOEF$ERprH=u8holnT}cwFWWsdN&j-+BekWIW?Yz;}sGi`=h2R4%(Uj z3jJWE>lp{_7O-kzvuuRHaVMrS;eg?5$NQ$6g)a$!mFjVvrxH^#uOJLF0)!|Vl* zqVOe8eVCzh(n6uL-Euu9UL4@r{P4cg*p6w4w~wDKEOyWtn)lzz<8iw&%o*-DyGsO~ zKfwKS_&-?BN=F&moc$sr@C*RcaFDvia^dNe-iE@ewe&dW-XnN+@=%suhkRfU;jVt& z2+lUpO1hVd{l!w4CS+G%Ux6P_n6@Jt=y3|JwL4yC*?k^%f94DpV`2@fnlE5pC_eL( zvd^+-rni*lCCrC&tirveBqb+a7L8=8{i?vECOgSyGI;jVEciSdSh*#&l=^mudtDft z!@ZdODXw~)f(dL7>b&D4{p6X!jDMfkS(w05*jrdTZ*Hr0UK}XQo!4HmE|0Q#sV_v+ z?B#gVv+Tvz&&5!fEhob>g=f=v1#zE&ZF&~jx=E$GRe6zJn3^q(!dNOrae-~oBInQO z+;W|ubL6^7;~*vswXd_0N1likU<}__@hUsu!Q(%pv#S4EeXWIBVWqZ6VUh{~Dbwr) zOJSOjKCN2{`ueVdtH&`Jfu+*E6|(K_zWOsSX&a&v`rK_NZ1C8t!YP=TGwKE#VT3R6 zNjZNr-CKBY#D?kD_6a|~*J(CC>5eq&Kim!F^E5|%2U2Vt{NC@57z^bFXASC3U|LUj zZD?M8L+S==1G^z8PulYcvoW%p-wWa)kcxok)$sgHvavjg2=-pSLbL1$1=fqDioo7Q zuxFy--o$}l>O_Sf6MCeA3eVecNq0GKWJm2v5z{0>^W~%=;mT~LEMuh-6JHh^*w5`w zi6=m6@j78g3%3(sFJC&ELSrQXx<`u~0V=K*(#b-EB)D?uU=i z(!y0E3xBxh zFB@12+arV%+Zy6$1Tx{lt9e}KxMkq_hqJX6ow(E{p3+;3+bfpBH2fEgik3{{rDK@; zJ2onD3T}xt7H6}?!s$OP@r}lsOM7oV-RM9ITZLJj-!OkKuWk4qG{c3cW@C$7qLZuU^~w?%LY){8a4m(pi7 z=jH~cN~McaFd?tO3ecC-fWGAZ=a1cS3MOzL1956Q3uZ)RU#4@F7aUH(eHYdQ=lY7@ zs@o4A&#WoDsl+LmkiQ?l_U=CQae(=>I!?jkhrG2fhY?2sBhIe2ePtsKmclgL;r-Nr zv)FImKga7O{65OxbE~u6xEb5bH@z`|`xQ(>MA)|$*QmNVLXTHln3k`+OoU;s`P(8m z1rz-*rnBt=n^IH66YdY5sKT|bY2G)$DVUIt&NaO?OkR-nF;-Sk{h)IBy59)O&rI>i5dj^JiS=n;iGoY=HY??3-vKURhw< zuy61lc6TFpp5j`Z;*-~n)tq~s#TsBWfoaq4`+A*a%cK>{?Y*|D_wXge-!@iCE1Pwi z5&d%5p|Ez+Xvb-8)yZKs@ElWntfoq(9Jb0g(+t@nE{;2tX8tZtl~A3=`^_%a26Q!l z!fOtI-cdlbf#)r7C(gVoYHiig@U~|l)57<$vdg|AO=5T=JLW%Y9K7~{^P;xBh2o#~ zOk1)-g;VfK2(PIK**&8V7q!ED0vi)p3YQz4XSmQ;x8>p(={?6O*h8#|kPN#9oPTrk z`CXiIOkhpW?`o}wmdVMV{_NDg}!Y`oq1Q4`DLv!#+(>N>v6 zrhaAWX~D6298bWj_|#lWc6Y1Wti912YB2pkV{XK&LsGlKHtNGW5eHIr!JdiO1<$kK znUDvAADZS1%)rivxr(ON04ZzYy?HE!X}Bl6W{Th`Tr*rddP9F1Viv(wa#^pA-u!Nd zx0;(lSJ*Fuy?J>)?7uY^6w6(O+N0*Ha0({;mOs;Yue|yv=S{t;ad$=YIEYhBo(zI= zGnEz2A0b~BpD+Z*%og`1V&44yxH;@F;lp55Sg zQy&cfiRMgo?(u^_sU_k!3ezg^wk*^rX_9O(Q)=v2FvT9+?Yvu>;*NUO9rV70XU}qJ zYz5H!2%d+*b4U0c{>S0HF2eW4#R8)f;xxs{jIm}4m>UrF0ohwI-WMaln(qBBf@cLs zrgNPT9;e{G3u}TM#mP;%yG_iyGI$n-M@~$`f9SUCrC$U8VSaOzsKioOubepW>9Diw z4=vLbP8H+61QS>j#HqJ+W%^F+#aNE2n}rEHhU3`)L~GN$IoD5qQVrrZifK8)Wwzix z{5T*HI0d&ptO@=L#y2hFR%a#Orr!V#&sZ>x=PR(AF?$NPATd_5feCB_)A0WXgTuMi z+p{GCw`xpaP4JEQ6Ll4){=MjthXVKdn8x!i_>%mIx?Hr-U$TJ-EG3_X|K@h-oX(r? z*Wwi1Q)5kps21MSIoO%!yO_Z52c}_X^nMF&@1L~+Zi$${nqXHZ>6z}u1M@ewFo9bi zrh%AX!_BX4p2Oj}$i_FJn!ApLY!-|k^4ZeGDZ8cll{VmxY<`8M=D2Ot?1XujX%+>u z@UL1XFV#b-Uff%0(tEw@L$8vlT$KkL9aIBn88eMru`%!GOHf5R8A z*KjLuv6sM;k$EASh-pRAoJvl-D;~;NEUhIR=MM5%YHN*9P4d4>ogm|#$g~Z4SmU}o{Zqyjj`R-Ss9%ds`=^jkUifw%(#2ddQHCVBeM;Z zKiKWds;$ts@-wwYCShlp%MK`$-PgSM9Zn&d!rqUhQW(0%N|X8XAd{ZRZaN#9I4g@Xs&At z+%8G;_HUnVX&R5XDDC4BGIm;udj9@dOyKV8dYpm@JnM%qV78sa)aYBRUeK+T9@|jA z%-8%_dRg)v({Pt;X%)rX#ykGX2bRJ#Ab3?rH+B566rttb9w*E8I9;D6p_o~(Hf&^Xb3_V_xVFGJ{bySCzOoKYE z!fv0mOq_!CW((IeXO99(IeFsL-{BnSC9ya7sX*E1H=t_On9`o_zY1d`%kc zjLrmaAzIsWCevi6K|Q7B2t7{0#3-oE>J~|?r$ksBFHsNB`ZFFIPQ%x^{+D8Ut_f1N z_IdJn9S!4o#}Q1EI@ZE_$HoTi70w5?2lovc)>SMZ<{JvQC1NQ|!;O(9!v#al8qB4l zDSFqEeDTuJeeC6&VSGsME8?9-``G2M2mPwxw%E7E9=6lbVNf4$8q`z_@i3p6!2i!@ z_l{_>2kf7kZa&P&Y$m$GPOR@f(=7n+r0ZI%n}`(Nv;=6D+C!G3LP*ssNVv~t3J z{4Q0-w_qV7QKctjP3C6jdzzL*Vq^r?1ozcObv0O(E)&u^81*(!%Ut|o3N-2(F|s{j zyjKi24z-3?V5584``~Lh4YDMx0jILpB6iFF9s-A!F&|&@UpK< zG!@)xsh=E)G6s44&}?2EZj6$?2sCBrHs^t@x;xi}uaQ(%hO%R;T@`n&j4=*|Sk~A{ zk*pTJh2%dkf-U3ki1F^G*piQBm@+TmywVcB)`RzG%NHfHr!wl&!?7{{*{@X_SE(GQ zX@%TDIv&TbaLmfVew}8zHisQ8tyn6q9mCr^)G~!$kCeu-Yc`#^Tn7~poc^fpF9pOxqWaD+kPRyfJXJNs@IWn)X zCj-WXYEt@NW~ag^0j>{_T%-{Z`W$49lC6>Zv)%jeZi>7lPTSLmn!UNgP0q`ZO&OxEd za*IPW(VefG&tkMHa`CBgU0Qh?U$4=$wz|$PmC9;BW*?@mU?-?9ZRK5iZ_vb(LUtvj z;PD)5f<5|H9hka9R03P_Q$}DZxs8vjt7uoO4$oy(V^TT)wEPs?k0-#l;M8*ig2-?K={d5@NrH0#?wl03v?JKQGk+EEeMdyzEajP3Qy7z1N!zKa*% zYgjok4MyZ=OCjR5H$;qr-_2)ONMr@YhOOq?XE-I%qd+|HIG_DLY@Kyn6yNv%$Hop+ z6kD-S-zJN~?hZS45w<9HzU{yy>_kB&Ol-w2b`Y4|*%<=^P_gSRwqRm6zq2#Gzn|B< z`SI62xc7N(-?{hPbI;B2>?Q0>zASx;P3IOgvVU>X3&!~{FxJf+25GZbXrFgO`aY8;>GpGW+n;J5B=eX>x;Z^q;|xwankmH1fNKJTvaZ*KhbV~%*RkxlcB z!taun_8eR-JIqG|RtV$!E1mpNS4 zb0mEY@GJ8;JY?pzj)1O279@sOUaxu&I$l0#|W!jOP3!bXrHQW8g>AKzFTgR}rpaAyj-xmc8>9Arow{+xP$$p}Q-zz%D z*%~0$eUWP|DBTkUoHWwTmkbY+3TLwaF^fctd)!28ENWxpXmAER)JLqdEK)ebtutOy#~%t8Mwa ztBEh0%H3^XKf7Bq*@eHdRNXu08&Sm&F=`f9lx6@VcKzyNilqPBXFJkB{u3%r>Hgfj zu}*$VCWT}=XPBCi{SC&#QNYk~Uuk}`POaTA`JQbl`@g7J99uk`Kzy_o(;hycW_x0ws|pd1*mkmddj0=t%){ zg|XJGyK9RKOXXfodPcc=KdP;MQdTG%OVcWMKwt@rG zl%0?!x6BE@e(c>)2l2aH--2?HKuP3{eSIK%Hz>l`>~Os#jDjuA}){yQ7zcpiLBN8L}U{1^OQ)>53(?wF0`2km&@{X~pzAP$r)IZ=FDs`28 zvp-v>c47A7{E8OL)$F(Vqz%V1m9tGdF~|4OpL5R7vr8u&J91P>17%?>q{$+sK~Hu= za2c`j&cc?6(_xqQ|^@6 zu2=HOS;W7i-oB1jsfs?~a(;O&{jS}u*MC;8!lNMZ-L5Le;n9UHn5!$zmPq&J-Q?cT z%#gWZsdTy5O=aezSu}2{T)OzpHRbMU0$d2)qqj*{r@fyV=c zyYFcQzG#{rWnmvfn*0uyePaGtZkLhY8CkDRn&8}{4|Qz&?vIsmB7&z zQLdQmMc)SrJdJS-wb8nx9Z?~seJv*oJ6t0X&2TiG=qDj z5I=_=S4QoduY-9^gMm?t>Cvv}Sb#|H-?B?y?sUUgNNaOdj9wD(&doK>b${I&35-?T zsj*ybG_ULv$?AS!SzWCXkvjW)f+5`(f0T}pp0e<+9)jbj_tMY0aa@RC-w&?8S&yyx z&Lr;5tYE;9AS$`fKjf=~R$;gorF*Gwu9@F#RlWSCnbTApa^jG_)cQ1OU?nr>O0hi0rAl|qW@X2!B}N{t z!jICac6~2srjDh(rM>?kQIsU5R1!HKrI$3#7$#QO^vb%9akg~axIh}Uh;;gtMsWNh zsZmlYSBH9K2iGOi3eu6;*K@SH8#zsM4U4tb`oRepg2elBOQl0A)0H(5%~u5q@R8Mb zD0PLo!dOVts|#~O#buQ`TV8#tYd~Gb>tk1>&B7(6hofGDbW7hRh~L>OD85wV;j! z36wNa-3S<}GuAoW7-{+B3C;hxy4xnitHF|{cusn;cniOk6%@z`v zHhI7BDX2?}QEz7=fw8dG8ODFd5v%{;$!tc;n|dTrtA^<@Oh%nSV#<_X#zh0&4XB61 z9*#7_3~hPO{4i40U*U+tSV+^leO?*fH)~IxF^D-qnqFRXEz0j&Gb;~~M)TDdvOF40 z?eUoAG0$L|qHSTA%6nRi=Y5;AmF9>oe--^I^?zvP3^ZqaqTd7PclA7kU9UT~NFVc0 zIzPu)KZrQ%W9BLm{ega;qu=(qk}Q6Aw-#slH5bqCNYG)(Q_9J6no-LWfwL=pog*%K z3cty}&tE-w-RhT8?_vqcTstP?w$z2}p$b#3Ce!au^!qPmhC4W`I{&Gf`r1u@YBj!ZcwyeQv=Z<_z5yq6rmZC%yII~TMAxPL;^B%Q_UGK-x-#oE+z?3H6s9#|_V=O!U zzc#lMb@z>E@`DHr`7iOmHh=Ex!ETw;ly$Wn60ps&$6(7+dsy1?4g*>%BMS45v5;mM zi&F=F=QGvA29^VB0dq)cwAS&57ON`&Y=i$2|Mq-_IeJJPA6tF4@JL{K+J3cacU3;? z%toag*nhBJX^B~VJM-`Vyr_e*u>G}!y*=jA%)pSJ$mUAw>ExRH{DLIB<8YqdZ^rGG*x24&qWcABD&HzYb zdh}B4&Qbc(IiW1SY@vWX0|}HwC+_i+%rD)q<(a9mS853#vY4#l$Qa(#c&f)(xK7me z#BO#Q%d(7RO5>*jh9H4!REBxi{<=BRs@4^T;OIh0bYk+OE<5NMCw}xEk%R=UadEXw z_S8S-w_4ilrhT6yVhE;zlITUYibu>dmR3;e3JL6eNRu||c~kyt8}&X8_I4yt62l~` zZ7yCPw?&5p#?pSHe#h14cjl|5QFV8!dq@1zQ zYKdM^dP#dVx2l^@;wwrR3u#*W^qI`gym8p*Gt1r5_V7EYaLt|EKbv|8jcA?7blJsq zp)U^Z+vwbxR+dIuS^l7vC59k@`!-rFZR^JNom-jxmR8q*Y0RT_+m+rsIF8alnruJX zMHp*$4rCA1@-e*L`a+s+-LB-yn^t{;7jIW`g*3x_+*gK8`p|<-{9M<91jfR&=`KL+ zb~=xIs*Vh;MUd7KiFJOt#ot!%G$4UiC`i*+ZKPmnTQP)Yrb{#38fs^tC2uS)DuaIQ>DTgFQz4<<6*U`DL3ebpx{t!y2giz*I8XCc6>?VawR^Me(H}!dXFDUcP%jl_i8AKY&q*UU^A! zY7vjSYNWM9V!!gdhoibH!VuIHpd_*?rk?0YJ#j#Kd=l>Ukw6^>!~D=4*6nbO*V%g_ z>JyRH60f6*>ZTW-rw|yT(UEAhAD!!0&^2zR&eWI&5~!%p?nkyDDm<_*>rrQkRyJCF;;ie1tt(Fli>;$~Cu0Z_14j&1&eiSbxTI$= zczX7{cssch*~z5zykW{d=w@0K9%Dm0nS7@oo2J&v@`_tww|bfT!QwgiNn4>c*;%3m zCfdfZcM?o*k3^e3Y_j`Y_HZ4iH$D#6*P&MtV_i<0?$4ZTs#QG3hOtV0x@0Qbe2VF9 zAA1@*2HZdq(6Ckvsob(~B;$wH{vO`AeK3@&VV6EV2zM}>cjY7!*21ua257K14<5Yqlc1R_#$6+j_ zX$?nqOSu!&Tp@w6&?1RpT&kAm^KDjro?!^uFrg&!^3Uuwmb*HI?ONMWW9fv}OjVL;)o2D3FpMDGXaFF|Vw$c3->yzRayS*Dp9ZMo2r z93|1ciADPj9{&{4H+R-r8zQYGR^*m5TxXkjuD%{BHn8{k;xCKlu-NBmf%-_DJ?hU$RF6W-dURG>G z$BcSxx*YnK$^M#$-J-E-u@zh?MeAJk@FjD~P<5ADbLkLMP_Zn=4DEprb2Ic8{G{SJ*bB zhpQOMCI@aaRR8%)z&gQ_V~sG(@bn4nu|BP6DiyLlvP4~9183u<0 zv(vkkGFH*|(_t}tzS zdwGllf90e4@;kO5#zLB2)$Lf8pL0^x8X$png*2_Np5+>2wg#{PP45fXe~>^)q#fK8 zAb$RsYb{#%o`%3!n+^;%v6EMDuDSNr(*4~5;{JEJ*58NY1q?v~`xsgFzYS$~Z*H7a zc!ya-V60ay2b<>aNHqo1nvpcycS6~%*8Of@?i90N2ol(*>C|!#!}c`>um zeVQ~yMGLW$68za(4Wu?0f&}(_x*;9Yg3S%ou`!dP3^)$3=WBa=c0hCXjE_5eq3&S~ zfpU>1?|ai5@Z%S$;~ZmQ$+g6i??=ox+J-8-B8-K7NlV03>CL_yUYsp4Aj5#MaMWrE z|K~&4cSYYD2d@aTAc5l%Y0~?&ooSR;?KI>@&J=Nc;J8DYVV-C9wDhU4H92T+sEB(R zjD>du7{=99RsZ8aGeZ$usEDgOyrH07k-43B7qaQ7@@cG=z`X&|q|2E6E!h%XF!?L( zad7pD1g6a}%_#r=?}LPAkzFmgcE;Nk+TC4Mhthn->Z;Ww#=^a!mS{MPe6Y-`#SX7g z-GVz)v~@;n7+SsNlk^wJuJ6)aod?PZ|D7z_8*^rm+}oNjR$)h-O`5NaC?qfzT3L~Xep+Y#)E@#v@H`47(VO1Sa?B~?tEi(E?)>2C64GR? zo>Y(z{->2f;OPqzm^Rsw6|Kat9ijR!!4T9sq9nRkL`1R4tMcRu^}9%ukH*eB-BSAN zbaovX>Tyw@jQUc#wMABXEq~=2eJ)*2z!0?3LyaDJHd@$(-)jg~a)q%_bEhSeZ@BQa z4v)=4pau$Q@{>BbD*v=+oje5gSENbzO2pS#^)wuFg;tD6(|+*mZ}aCr1ja(kOf50t ziOp=8-C4;M+UX*JlE{Adj<=!CvJiG*S;>MSsP{uj3{$>LsCeSD z)94}R>UvDXG%#)QZd_rmSpT@e>Ud(d1@n&SX^FOt=~i*hV#}28Mhm8av5=;f{(w+% zTg|INd*`JV48it5Nn{;eYmVr$C)V(H#jZw-h2_u^1?zkguB;?&m(at4HwLh-uzYlD z>yx)Wjdn!6ribeBE&viJiOy0Nl;+p(Qg5=NT{sdbiB|eSCHdq3pIZ>v&Uhn&?DT7F z@$CF2l${fhq{mozlR!)4pXg8&|dklCB0%=MfX-NCVY`$`G9;&p?(pZJo+ zKi$X4ZYEj^v=LVfs3qL%_rPln-NLqqq{1z1ltg!58uz%+C=H~wguNWs$80`vgUW&V{ckx^C*AtvkF3yYcaiVeg8k*1 zp%DLuAc1MqZH@*-#BW3Tv)<)r=`jQeypc_3MOB>nw1cG*?B{A23)@CZMC8vlpZ#;2 z9Pfr>$uVsj=l3Qi$IxvKozo;e5*Q2bjMEK;-dptMj8OL3!2A{rK|-6Ww?iNED`G|~ z{R(T>{`=p0Lz=!Hx?TLd!|F*jhG46qB+?<%`#x_H>WE|CUe)v~d%gYJE44)YXd_>u zMn@%A7z_IqQ?rVp6WvgFtDKlrUTolJ{uv(_f^CD67$&uGA%0Ti@jN3636w+@LQXm6 z(xZx9E^SNp$1zV@p2c@eHM3VF=#fKuM%$pjmW55f>#5 zTumT>k{D(T5tGw<<|zm66HpSpQ+@NAIVD>?6GmBhUlD1#NAJ*+cd4m*Vrxk4T$pZ4 z+V8s}t@QzsJ1J0nFe1YE{9rjtiKAD&4w07&yN6JuwZwr|f#Ro^YmC*aSI`g`3w=(| z8RVuG;_Tk;Vu`Ms1eA;E;aywOSzfOr4q4YuEaUlHzz`%3ZGY~SXiQadOYLEb;6o}L zQfe1d$5=>{&E4_Y{PudPZ(P)vV-7KGnsXLb4Tt2XVox$++ZV_^$w ziN8*G^JPw`Gc^)naGzI0Gfzr==Tk1KrvP}z74OvItyc0t&yZ-%KqsQskmgCXpB)!adyZ!zsI4c>_We+?341u{Rc1j8 zh9H5r%qdrs>+>;IwU=Nl>`PkWYtdMtJgxeYf?j)K8c1M2W|*=KY{{)oBqm=aeF?s< zfhQ(f|I}|E75Au=?dW-xP8yKFJM~DDwMfM$Nt5MAN$Eu3=?lg}n(l_Li?lqCZDiS4 zIaG63A5Te860Md((+oR0ElO%_4$=64Kpz0w6O*`;`#qjNpX~9Ha)o+PBv2>IFgZ)| z8w)fX|+9Y9YJp-C5oD)>tw0WK+!t? z6_jJVIeUmWZJX7CvGk@;>C)Vjrde6hHZ74>^sCWYV2~JUdTBx5T}YrLh8a1&9J@>M z6Lms$4RMoOFMa5`*Ysn5j16gewP$y8_ErAY;vj1i4RN660jWyKDASb1Q8uK>&t3Es z;mWs+qzkkX$B;dD5~LP~qfHBrN7=?b-X+D5kCf=QcAfrG-Cp6;vVor8Xl=dq{$nYO z%krv!FWT08$y;fk?=7!FU!rWgdft$_?RPWPTx!?QAIZO8`0{X^=L{k+1c}*^52cJk ztxO*`+SBNF@t3vvf`07%_FarKCJdHt9#1t{$-~!xCgGBwOOokTaFlIP_D(5e)jpH` zJy3>mCZ9E2rzVMu4rB{R_>!NRF?5>MlFq!otQag+T(E-k3$f>_)}F%rw1$z&w^qnp zF8ge~EZLkKZJTqxNd?FHv+wBb?Sap~OQud?w$=2Ttn^j~i%G?b7#E*+vGjZWP0DUi z&UlqxvO1HTH-E^)~~yh z_0d)dDjB+i(}bwPeVjdFL9#N z(0pWjj5Nb^%q}C2ecXfHI_8IfJr4U7_BZn6NoTc<=sj$QomU0yahL|?mQJv;L&b{& zE||09GBgCHfi&58t*gyn_;X&1u`q{Pq7~m!ob;>)D`%IrFz+u(w;E0{ed-@=6Q-w2 zndN4hO42C8F;7;-^t$Ts`d!%M3cK|v7ssG>W|+{drFfUuv5~E=Xb6m@O`~dcPf`5Q zm`%$*Wxx>36{gKFZ$In!CHd5IPAnnDLYiR`3RU1+3aYgThG09RB)T)&u`6GMZ@Bm=?Wu9bhBO0);21y$gu^5{s7PKrw3&rDt)Fwjj^GrMMB7u^~GV@gsTT16-ecRL1(#Gqp z#P@h^d>a&HYqb2i#7l?0R_yF9RS^>0<~IPO~S; ztE#N?Ivv=J2=8s>b?$De1vZ8tfwt9TXPMBS{SsbSv>uHUF4RtyBIymlc}8ymza`po zjNj+Q8kzdyvRerjBrq0!6UmaJ1CRP9OO9z^ENwXo z_?>lg=a(yWg&|mSlted1__6Guvgy_$jw>wqt;JYKlOC?sIJQUC)7BlYPFb*ikU&Xv z$NkPQA$(}M{w2-WSU=bku@>n3gI%4tcGVl96%iPMBN*2bWS^Kd!*lSs>YjaRWr+l) zfi&5ER68zgCM%&@WXp+b9Grc$^X}Qp>x4O(I>VO}S^{Suq{;5Jud86GdQBfh;{)@H z1g1?ZWRs6@w|qN&8Cr|to(xxdS|T?0XVR)!Tl8mWEs85kBv2B=d>ymYOi z>yiT70>rcFxyIxBKM7AKtd^w8+V}TS z`5^hD8&=W2z8X%%9U`6#cqgDNBv2B=oF}iXO@==-XAaa7m@A}dy-VH@+mbiLAxE|4 zz>*`)FuD>Y{?DTv#zMJT;>OO>{5PAr>cbKufs)8m$dg>_FDgCX`?aP$kk%6I$XB0* z);@!3zSYz&64jCU|6`>$E%X@4&jdmqY0Npuf#b++N?i+rum_=afGz#fj0 zh@hTW{%c{+o@b8>n7X}o|Mh^0wiKlIAuFUCIpnSIh?c;cVMvose{Xf(XTG}1z*uqZWo}1L(C7ygJ$#ZTwP^>PCF!Y~{mY32dT~LTY-@W}(8Z>$&XWe7 zpCe6gPP&%V&ECC5A@KYh2~3+|`s^&Nt8z`fm4YGY4+168Yn!L5>AbgY$dfDd2Z1!h z)aYGY_aZb%A<(l45|}o_%=9U%>-gu6B8K1zCQ72)faJG!)Oyuh51y+bfs*LUnNvXb zYpm*xL>uxyPx2^bK3_8ff&Yl$shexhduNA}c!#uf}gKm90)Vd@s{Ca&w_ELKi-vY_W- zOhZe!FZgL*|4}_FLjS}_Yl*gJhKpYAS;nJvK5NQ>xk5=~HQBDTm_L;>9t`#tv97R8 zm_u42e+&}CUDg}gkQYI$QA`7Ay3KK+4qx9rI$|(CpiH_ zkigdw$QCDcu@L`0lufN^(qjk`m_zb8(7LO>3hnCa{e4)EHHtaZmi**|xAwV86h3X# zVF(iVssvfYFLdIYomF>Uc%q23mIxWwh+p1HZyzHfdgDeK-_Rhv&z8AtrxSW(@zjN$ zNT8=|q-jn(6Ur8;(Jua@t%(J_e0PoX=|re<{xpqLZEMT z^cSv8<67k^e6!8gJVYv-pCipMXYSPGo9K$&hr}%Rd z)DeZ=@zKLP`lP3EKDG|ODNxn*;kg>pTH;`CJ^otiHYHaWf+rX#iR=?k_0#X35Gwjq zSYkl}&q9zU8?Tz(1t};*EPM5yhQRwDNHfeapJM!rz!^%e@D)#dDfD;4Q{1DPu7BPc z<@ugs?)}p2{N6!&jD_baTH>pFPjT>;GA#Rq)8nhig)f4k~ z;Vq|Xrkb9R_9MQAuYk8*wD(xNrk4|!r~8RcY(dRS8+f}$d&bi1`WNfL)q})S=Pz1X z^EFJp=q-^dV|@j@gM&2Lc*VzA&(n!Xvxmn7B=D{!(xi>55^Hg+PhJGAmj%50h_8~M zr8MmzJGT{T62lfAGcHV-$ey@#!GiDLU@WBRMd)V+e%-P<%It%$ z(b|cB-`zn;^ma|)A@j;!I}`$6?Lh)1(b-+y()`(Ts&yN_+l922u;yGbcga>Qm+{pe zBv2BqmO5`U*L76CgZN$%(psY2i^}}^R;pbFhT!{1D2ZY2e5x+KCqIqS`39O7Z}C-K zd{K$cAYBLQ9M7t~9bf3hSV+^|rQ;vnejQn(v^f&^;t}tT5vyj+Q@VTjZ;S0(eTx20M#f?v`s@_UL z0%PIIfL?>D@sIgo$T6i~;agisYl-}umh+YOj!_7Ftrcl4QMzX+JM3+wM~wrK1|;xB zE~FWz-jbQ@$lOrt#xy?*68KUq(qtpNzA#(2M?djap>q~|TNYoYMVdSndY9Dsa_a1Z zZ^I#>eZThL@20xLE(uBtB7t&|rXBt5vu@q9{PPf)ccf_txu(4CWlPoT5cUQnFl{Rn0a-(XdqG;mLalIYxki0#FCg*maW!vB41k360<4P^bK z)y4}gBP_V{!k6r{@7+BWLs|2;VisNZ7XpSLu~PGHUw-!x_Sg6vgEcxLNfQflq9tO@ zCicX@`fO;sG-Z$TZ+0!f(aZ0TL&SUibe1oEdky$jIKI7&G@U`Vnjl(VTa6cIcd{UX z@026WF#FGLYjwUyE1i9{gds@a3*=PtWLJ0Z$Ccgf1ct=IE8r-JVfrsN=(fFAS2Fl& zIT9#|Y-@7|>fZY-Q*wnf84@Uo_JjRRhwM2j^=&YZA@<+@zIl$4=v$i@z&?JJYwY#n zff)&G8>C5JQhzXeKKZ+G*qmrR68I`R(hReFG^yVll95(yF{4!MiA2UrJ^cy8n zn_tSu->a#ft6>PrMM-qOc259XkxqVQ&NwdMt^sMSzl_O5Tzs2rj4FRZI7&Ve&eEG| zR;p2?wZ!~;`S=2#)p3pl_Hd->-d(SXJoo38DH8VIyUFi;E~SSwX*r4LcvY<{jD2~>4&O|qOkS4!47eiU!D-lBeU5*wcP#c9botS(HWxM-# zPY&BXU#Y8q^N#g{GJ~B!qb2iVL(johA+T#R>Bh=@P=rdX(_i2Me^qTSt~O1vppUBh7r5)Y_G zE>Ml^Q_>jSd$4%A?RTR-db=CO!qRGqOS3ESjZ1VVV~?8m5QAWh?=?i_JbKp$)M!%mijFE=>XdoQIALwp4! z25!2^Ex-6h8O`(_OZmQHlj07naO%DVLr#{u$vyi0Tl$C6NSbqLd z?;3YIjAS!hepp@`uW%Fg|0RDXyGQ3H8C*B-zvT3uK0@=IH#y;aD|u&!ved7(Uuwb^ zY^RnSi6F0Q-08&yWVGo>eKfg> z%(=`tu5Knbp!Sd7ewll6w2AVYe5+fI8k(F4VKbZcvTzM=aOK0@ln~7OmajLt84uL| zldZvh($4FKvSVh@{SOF1qL=9w_o9cJe7yQGIuq8re=`;sH<*3D(Ak2qu&%U3)}zvF z=NVmD|CxUqG1e#k7I%7;yS%5XkDw)@E=*;|L~b`;Kk{7@f&}K4`qlsa%@e&=-{Q*b zYps+VYe7qN$~T^M`FO^7eqx${A(#eAA~khX8FsB_Pj+AYaKVjD=Vpex%K53CvHf>- zqj#4-yZ&j9EzTjv*~|>K@ssa{%X2fhQD+Ot<#T-mZ0C0aE^`$Y=9ATLRO6df#LB=6-Ys%SlPk;#(zNr6oyq^G zsd`q$)GEv<%gUIRAwI}upCI!w|3qob9`O(Jz=aLjDCi&tHTO8>)_T zjOE|@A=hK*N6GGeQA_L_U63y~C~wIz7SiPXBF>*pt5Ha7n*G!>^3_AG%!0Sly7|5W z)|-~t?=XOMeD%{hZfJEYmK+I`M7r0sYPwZ37AkdxAy`)^iC!6tE~TsaC^8R$^@cQg zFzfTn&0&#{hrn4IX@*%ozc61yuUb=K?c$d~TXNHzifo;yn~h(5Sr$W(z z5=~Z}zPpufIA0+!WLt+TT-D*vq`94Z1(Za$wkCKP+T;rryKY%;!B{IDGPo|8PyX-A z`ES~^PIPL+&Zyo@Y?nRHfW(;g>0J3^A0_)Y3Te`$dJg2%y<&M9Q6he~F&5Gcv(=B` zgGQ+9T@1nX6-pvK!`yx5fR(Dx8YGrnlDSLqS;|@+X@-d|_{-e&QC)GP85;a0nxS(RSm3ba%YQTv_d7p}T)3`n992Z)$ zuCjhW`u{#q^kbeF(c&C;!tA2V=Xf&C=A7kp-nIXHKe~9YHJ_;#t(3e^Ux6Ft$H~{n zKeHi$lE|w{`6cGz5$hEKLn_2rxh4BL$Z15QB!+psYY;n^`DyLIIa!eKEg*6Sc6N}B z^p!!HtP{SqH5cMWD`{NkPjTa~b(3`zYf7Wj+-ALx{1^Rhm1E`VO!JegE8nPL{a2db zE>o>{P%hG1BDv`*zK5-ik_Lv{8DZhBdvsLNKuL7FCbk6c;J-Ex5!L)G7d_5TDTmX+ zBrdA(Q28|7uA*ib5X&dkZ>JC#f@xsdGzPOeif5nI5Zf0&=9$t^;F$XD7Jq-XGQ=F2o!zXto4g>X5mPfO>C!1VkAeK~1Y33;cIt1707{3<`yx((An z0ws~xh_Dj;+m34A#SnYmhtz8$hf;bdiEcZMA0a+Wd1mZwyQarj*fX@m;IzSF-?d+j zFU0MhNT4ML(hRe*#1Qe|(J#ikdt5zRACS28PEBR|jXWe!66wNQ&tS7wEw{E!>1&8C z^U1U~UwLWMooJiGzHC#!SA8UVzuKJdt!ZX^RtlushqPumK7sXpY_Zu&rNRy9uH_M{>B>!BN@{Dj%P8_D*Z6Z+09#>| zAj}#OX^KnyN4iA!1b2uWH|29H`6m5#T({1&@bo{@m!Ed4`!-*lcvCsG%`q0Hr|l&! z7g@f@c=h}o(?9|x(Hn<}^;!SUCh=yQ>zZ6)PLO7p8MErKA=5bV%aS1ih9H5pK%PAN z{?f;eh!^C`p`t^jM<$20-KC!Uqixul+7|qiQZ8(j1vd3=Z&t_9V{bC+%SD!9xCk3(CS+ zNYiVyQ^tvnPs`TJB~mm5#zLRDWLtZvznHzPusCn&J^@3J&{{f`;4A93e_N8L91-iI zO}_j0nCuz^q#35$(z3cGv(%GnEIHaRAx(ZJnmOunzUNH?Esv0j_jYMrd z-J-i)N!NK*-jetJewfRDBvRVx>nornx{*7#hR#1gwUfb|1lB&tZTPiKx>w&>xKKbF-o~q8qs`3-}u6Je4&=)}7s4{Ob$S z2wF#DETn1FZpt)AKUe2=B(UU2(_2EfEATrTELGCL^9UqR62p9_8$y0ha*c(LycRV6 zE8x6EOZ0X2V8@7mv5D8#8{UjN$W?B5SQ=5x7nx=C>gu^AMgu{)Rqy;@Na^jDxRm%@$*%oEN#t`mXCV8JjbSGpGa690gu5`L z8OGevNtdo0sN`y9zwzA9=T7q2Lf!)EdbGs5agMqH8$uNVwH!#GBsv+@y>MH-+F2p` zgk^9$+j`4BSG)y`Lr6#l-D&HxhPK>NT4LTz3k_xTRv1JFa$M_ zm|KR~{b>jr-0P$D=)sbDBv4O@G{a0@JCLA5E)_|NEOKqW&AToLXJ@{{ghyMgn!ANRwu}a!bBk@0GlLe~v`#(G>1i zS6^j!*W~UgZt|e6%5TzgerdovcZ^U748b%|68W-N8z6e<7`Awu-^r+BMFJ&}kCZM= z`Oe=|zqL3faIByt8XrzY`0`^^%>;&^W&$PA8$4zwzV<5h8-)b!u#qN9z!naCzw>Iz zaTkvSO8Q@G*lQO{=sfQ%SNXGAyH!bpaM#oOPwmdFl22TFW}sMpR4WU{LOp|)*p~g? z8rf*5xT9KG3-0@oKuP4eC1L=3eMbS&zxbgfZ0AaJ`KxMee7BF*j$V~5NMJukn*8GYY|MB5qP7Rd!XBNAHgaBs%?$bBg% z7;A9tbnd|%Kjr^4i+-=c_wA_mU5tfkXo-h(x6icshw;?B6`mLiN2->X_$$Zl)5WMf zb0W@z$M0U^wx#uwm&V!W#Ht_PSx?>>Dt^i6t;bkcCM~hMn4W#z*in?iPZ|@h$lQ<6 z;qpDZUIc1EBZ=`i8o;uJ8L@QOO}8HO-HtCYT3%DqTR>V%>`dm^uCDdi12qchPqjVD z9g3VLccOW)?2RMbj4M-R6Q$Ru)-mqI?Lg%>ZE=E!^G~aB$~ebZsFTqW)1TH5V+VC) z&t*(7+#7e8Yq3pDBjxu&uEda;axF>&C6Ptzf^vMJ!Rko^?)5Pi()5xU`Hl|krP={t zPLM!J1Q-r)s5#u~5&XC4xFR@smrcX&`~x7Ni+w=eJyA=hy&t>&}Y;>UXd;Q9ncF z$hj*pJ?H6rWzrjNJI+pd=eu8PuVxlsGXFoAAsgci2T`f>juFxJ%G$4ssz5~LeN z?HaFZhgK%<_RsO?N_Uqq1odJcUdNcKd`OoHp0jJbqV8W${%6w(&sg&ChapI4bxZoK zx09nL=6Z(Hi)R+!bv@NenaM%*|xqBXRm8=?`e&j3(c~VM58Fb;G4;Gmn~Ud2eHO*okZ@bw+w?uwPGscHI- z6B4l&x=KZPWHxMs`Szwv8#f((8$H zK6y=qy{>$wxF)un`$WHhypbS*IYF9iQdw3Q9u$>)mu|SVFZ95+x^6*v$CW5sC6|@9 z>$UUAlU_vIUV5z(lOGh8t7O?*P)evKWXxrSVDc@31n*E*a-tkMQVx-(Hh0)#J(W3y zO_KE%r`hdIMZ3I_dZly|u(X(4vM+h});cENFm`PuJpvB|)*I4vQhl(LIBr`Hw(5>2 zmhWx$n8dXsAly4Lg7zWYr?wQD4^IsruoND(p< zh6S)KIY#{4ds{LR*Wwd7OYnTTA$^^ZW|*@Bs_?;IRJ)}?wNG+sl~>CN^o3kC4XC(8ZcQtW-#_BH`vH;ii*e6r4BnYKP;6K^ zKik}Mq;T?$zzzSpSS~|3K>{U_<-qPp{j>^w^jqk)O-$Wok(JvTu~=?du$&DgF-$9u zD&p=&E!awLPa84Tjx!>+`uh@j>fhakcRnIl>;7W-owMEEC#$w2JGrti%e=A~kidFF znzT5F=sr#})lMH{`9J2lm(`=?#$q=?OAHO@s%!M;=H&QGM>yl5wer2g-2^015}oia zeCSrM&sL@HW(4l$Dz1r=H&5s$Agv{q^eLh9d^#WxaX)n*H=)87`ByhBP5blT)pgJJ zkIF+dyS|0%C2f|UI(8F~rn?#2it1|gRd1PMt_pqF$oVzfq!37xr>O?6e8AWpynR<> zkJXc6$(0>#GYYKdo)y?E@2B5Y`mW>RKCF`;({GyLrgmX}&8{kj*2`~L7ZuG-+O|cm z{<5p!Wr*fh`NYZ_{zFqQVRBEDxH?Kn17o3FOpjrjR2a(Ny09h>QI&EsW5zalN}gO@ z$g0F&|3hG`RPR-sG!@H zVcgkIo8&Rd_}Jg1Fnh6}KRYEooR^6xO~i7NTeACNZnYF8Pp4R=>310Yw*Q~j)JHn; znd^g;G%(h7^L%b%PLv||!-%Dvd*!uCdenl;41AT9>Nv*`Bxc7i=0fv@%WITev2uXe zbxN)=C;hfi|Jx$&yDeN!qSP@K(xm-ZHcT8k=Z*2@(2^cVV5~y?d~W@RD0#M0j>+zm zMep3B)|X>yBw`2>Zx$`!s=KV0hp2Ux)t+~Gt=a)#2ohK$v?3e&!8)t;P%%3_)3fH` z72Mmf&GHyZ{T<1zN^?!L6-3k_9g1{_fs3u$`w zZBrZG@8vbKeJ(+w@62d!g7bD|3|_0+ovYXIklePCeS9RYslX3kt=@M=0%J`Kj`!;H zYolC^JipOgvaKS&@ws{mfFYPGl*BL}?p5SnH>sKlB(MdMCR>~alf@T4$E+Fb5*_w- zY&E1QSGif{ry1&eg#^ZOz81{wr&-iK6VcxJ$W8OJacZtG1ji#vqP=s`$!5~XD0hCg ze+%OR0@XPR=PT?Bl!jj)add$aZ1caSyJ5&qq6ZLdpCwR|N{k_*#p0=M*nf~fN#w(H z{s1;`X92Nmoh<_PE6kO)m$2;zvm=AQTRSf6+8RTUNDPVK!tSX#q!X;)r+KfU=ahbh z-wdR+L`r5+K5Nr-WemnTM{u>m*U2$7XJBauwO__%#;%q(D09h{5C`@{NIy0^P7n^4 zUdcVI8X@1M`axPt_)RIpo*dAV{WAPHzm3wUMrmaHhd@cx+uIc3Tg+7Fb}YwAm)%^< z+%RPgca_!>CEYg4Ka^flw$MoNnadOF6W5}awY_$8!)k;nYc(W_&fLWrYpj%KDEg8M zNd2^)}II)fES*xW@BTX7ed&KPGP7hr1XPtPV%xKTZtD&M;siFnt zVh($L*u#CA9rh2%Ju#^N6~(f_0E?ZbH&H%sKt<3l9`*R3zF?tHYkbw zs!giSm#AJ-8G}ePa7y6*>M&Q))*;O>?uDHAyOq>&jyf_VP!j3%lir=^dFzbQcQFL@ zdnk$4qG!gj-)5y)rIVwRkqG{El)K)0hTMTx`bd)(sCE%8#vVPXj40F&qBas~^84|n zBLBhg$0`hTh^PZX4HCV>d!aNRR!-GAqfQSAtv=CX#{jY8q5|wvea&PfFc#{W=-lAr zZA;^_&8&6#Ib!9ekz7LWY4XKZ8*HhC_i_ubE|yDPj); zEaRr-e&rDHX~B`)n%&;={J#+r1#?aUzaol#=<(J^N(X{$@5Xk zu{|({SR)K`fIO1^y(K{OyQd|vrje$1+~4O~4fI0r{KQO63nGDO(}+6lz*oJHWr^vj z?Iqfrj8Cc{c9X3wH&E@i8`d*%e62*wu@50)#<{U_8P9I=u@?4_|HabM7k74O^Xd69 zLtFA2g+z_;fpUWjo#j}1RRC$K-EOADvX|lvxiv$@b17rFCm!A8o7CGe)`JZLxdCaN z<&BYcdir$=6*3S^%}G6U29GOSEI)pPh&h{ANQLh|ksi*Bv0E(LuP&fm-s z9$qA`Tx)tu#m{|~zU+#!y>0F#4K1G|y;>Gyd$p#v2qg)@cf6oi*+2ZPwJDMDqW{H6i#+ICQW7%q_E8B{}5h{OIjjM7ZkE?kYD6_ ziBiA!f)u|YN<*L|@_2GEM;Oz8vM`?BEJC94$#YV!?|NxhmX>B1j~>bTL5IG2{vhv> z!jQ{St?65(`PZUtNT4K!x!tyrzHPamN!>`Nzk1Fq>Ch){X-X%m(Z-LYz^&b-nRlaY zXBs|~nl4`;6;a;*m=;=B-z$8ir`LaoxXhQ5_qJlv{*-79O;$)JL)f8vA`I;C2+O1q z@1%L3SJps{N!ul|1xDZcm^Q;K{t#h2VDq!MGzk=) z3%!!ItsU#Ny-tjVKuL64Ha0c6{_B+@sgg>ioMCd zs0A?u>jx##yU5cITDYc;#t!3yG-)7#HBDz;KcX#18Wk{hY8I^V{*7|A#E2Rdc+&{g zufdV3r{u7@u5v7`!uGZ~D__1*Q|9US@t3^(wMSLCjIvtt8&7xDb_`lYtiAC0*);dcDu?L1_3MHIQ$%Q7m${kK=36#VzTj)G^-#_#sbj}q`8Wqz< z%gz4^H!-xEK(FBBReoV9zI-ipOfcq7uj_p%`mIjQoM76 zyhQ)#1M-kh%S`rNBhuuPd}t|tjALE`5){D^e|e2 zDb$&7bXO%X)*hdO^3<2H($YLcrCU`*w`-lmsg2$nd`}&et@1{x_QTG?_|zk$8H$v` zi9njXFAjC!Yd2O;sxftpg*3f6*|dbQ=c-_F-?x>5VeD}^{Z5p0^|CgN?jA>EBc*3g zn_*%Hy*F3bs-}Um1_zyxk6l|Y&CF8{vD#EN>**$P^!MD*acjIBS#O(EJg&2F9{^w5hj2_E@v5+QvhUUH4J!eX=zpWXDPa*O0;Gzem`BMv zeMQZZk5X>P;qWQ{uaD26f z>fRZNZsU{WB4g5|S0oo{dTG46EAL-NwJ*V5g5wS)(L20*dx#e!3bC7)kFw%eLjol+ zOwf&nJny0Iwow+ATuTTStMPBU_nv?kdzNDB=KtwY%i=T?TE*~jEX z6tXV7vw*RXrql4c0}O^4p{!3z1;bW{BXZ(;UV6M$OQ0mWNB{bzo994Z9cfb8_yW`9 zhA*6CJJF6gBqujHCbc};SwKm&kLuY%cdeaj_liWfCkN!;XII!C1Jm{O9#`sp|0s(v3Ox6>{@u-B^d#PHdYoS1hMJ_ehy!IWXZz zR{;r>L^pU&cVV5sII|;0Zr2dFrbe3foW;trmuLC0zx$+U2wcN!*X_~!OR+6td$4}v zo?7C9+DnzmX2O1UhXm%9ykAtUpsV_9k*>*QDXN9_i|r*} zQfiji^2IFUy^Zb`j8%5mDER=@PdiFOOMJ966))dy!}`m0Ef|8i!raoFc(H;m(s^T^ zTp_I`+-s2C>-=BFW-;ytjD@+v^vIr}aXJ3(vj4}|TgO$=b^ZUNVk>rcVYeKG1G5zY zyF0+{!VV;CK*jDROl%kh&Y9sX6T9`YyE`%Yt~2MlpZhb9zvsta=fz&{wRX>rwf7#P z*!R^?3U{-N#6S1*D%J1w&dZus1EVOq z);tPR?8LRKvrO{}IL?w`--oo3m@%Vk!p1v}oAHpq7$Pl6EvJ<-^->-EZU&xz)MFo( zsSkZENT4Q3%Hy}Q!R=vJP4;mK<`ojCiErO~_R%%#-i11WA=ne4Chncu6 zdQPPI4W3VhOy6=&)d}p8vByE%>_IoYkg4j>89K2h&lp=h-jNO^;lBEl8jy_AotP)^t{L_}ry*T1Q8+$Iu98BY~RO4|#uxI{e{e zaVz>!GKSRnw3eEDk0vXp2{rK-XYvBov+5+#wo82vBnGTmMYEiu=?)V}^I6N21x&N5 zcGPpXrt3DBLK;_4M67daT}k-blZCZlavEeJw~EiDrB2 znQVO>?R@Il9TdsFW8PVOEl3-QyCYhdf_B<;8_};fP{7J4y_O(>nk4DYJ7-g)g)?;m zYah}^;?qGtErxv{F9zN_oT=hY8XmG!;+Lk@WFqo{{V=nvOK)Wl!4gC!MP7QOe;P^yJ1uMV+2d)+k> z9p^mq+;}ud+h1gfwds>RRQ&T|U2pCd`)Kvh#k6Z{a0-#WPlxHF(?a^n<O}%I@mb3ny|sWP8MPYLo)!$jT7sJR?M(09TE@W{wcU+J8i)$me2JrlZXVC zInum3*m$K};P3>k$;|8?SbqYFY$dO?^YwHL^NgjIP3F^3yT%jl|GxPNMjyo|;#O2-jji*h7as!R&d0F+9hy&B?J%)bpxa zh@WOww{b|wP zkKZf$U0S(Npv_-4#vd8t_4DdNoj{uJi0@WfDe2*ONdRrsoH^Jl;!T9^dyF*S2(+)T z>CkY;$^@=u;CRzSHsn_!D~2HPqVNQ-fE^Bd{MN5ebV6jqlX|Q$1c@blkNB4nf&codWk1wI z`B2MCCu($??3ErEuE!l|Be5=*(7F$U8mPXqGRrVWnQ>q zKZvxENLy9Z^s4&bvu!LJ?1{K0-YaUV|JbqiYLL1g;MJK|Ah%v>Wtgk;nEF9h)AZwx z+1;%66TPnR8sgW7ECmE=;#!ikmPx9(LQgri1Eh__$!e<-Hg#~^#*VG?YtboQ%XmG} zepbfV20OR+R=kEzRqWpn?DdgAO_G%KAthnn=4Cp8A?O#5n)nV=k1a|LxA8jR<~`5r z_V`HMa~TQL#5WawE~3`S79{R%%VfniPT*?Ghwj_3H0(t zn#b+goU~qTdTDESx9~vgNT4P@A9eeALQsEO}kX>m7Uzy`G;=S24l z*2Wcswab6D(%YmtG}&i$N@&7n+FN%9U8%b!q=Gj9o)(uG~LE_p~dXWY5#q@Zchs3-{=p^ zFJTVqWMd(!EoZ3*|a=;LSf>zgsiPpdvd(nkF*ZJGY|hOJ1EB{uun4D{tgT9SG? z#dtXN%VwQ(&gc&}*Jh(Zm1|SOrK?knUPyz7AGWR;)Wvh~`e4oAoxt8yv!5h;9e%ws zWx!xhsvn!v>yWG6OZWB;f06L|r<_>5sP*QtWAtioISS{w4Eh(LJzils(pk87b{4~j zwKRAkp{Eo2F!A@JM0b%`BRij5n&E+Z(H_$5Su?Ahk~z;Yz4t+>mM2eAwj32{3de9- zyOWf*z8uZaXI|08Mk{Hr9P`=`4~@n>^r7Y)f&^;fvrAsCipO@xR}DkFhgs<9a4+i4 zG-~3PXl86y(n`%suzxvGs+GHy;A)U{ZN^ktyP+brEUQyFdMZ}{Sp9Ciaf@=&ZFal}B40;N^i*6>eUj2lYDXDCi^XdrA%WUIrhAe*qL&XUJcAdU0XD_AT3GjE>$)8 z*FE}|jkz<=Q*1i8n=KBQ;=5Ap@0%Obb+ULHeLaj>tMZ8QpPp3-0vRRilH_&{4`_K2TkN;Vv6a7wK zrVTqD>rzOdZAltu%V)~6sjp6ad3u{JWIn4CNE?YZ7C-Izt#tWX@+&iX1tle4r14vW zZT54bs7aD;@!rHIzWcNCmJd<_|S3Z z01_B?q}hYc(%tmozP=VNPzrtgjD&Nya;CRl4jbq%h6HNjb0M9|m;$~!)&MXB%NaFE zQrG%F;=cts)_qV4_nNQO8A@MypWE(n!LPohWzquc^wNgb%4tQZ%cV!rni}(H5bul{ zi9#;LwXpiFHPf`5o*05e;_o5UsARalGcHMe8)s9tSf48PuK}(Up%l`5kMM<}rjc=u zT{5(R^Gr-1-*Y!On`!p@uJ*aDKmt8SkYEl`-5||^B6f)(kYv{)itwfWp798W^48ll^%|6*Rgo&;` zTP+(iuJQWB>s0oWY)GIczL_G;N$I=XF|WlL3lgY_Z_;tjt9+j`Lr*ypC}m&w`I-<$ zk@_jR={ZJfQ*V--l4FS#LvU_@n)p=8y8hbjDsN?v+xcvF zC26MPv@C|$e;0i^Tc=SIp8);ftSxKPSv$LJp9Q7RhLLEsK7*Ecq__4hV}d&pn4?JZ zP0$^_C~1#l^}L$GyP=IZCid0yqqSqHVAF7#!oUB#=lvE=pJO-UYK8$K`}WszmityS zO5qI2Nc6CfWwjFPk&o}#!Z`;L#@WQLTqZ5{MSbnegH0A3h2zK@$MC#DKf9<>H{CIJ z?sTj-MP|-P`?z<;5jkq&cN7N{RmPTZc;g~*^7{u{xl6TeHMnLV&8MAm4A&NCI;%RJ z4)(+oJSc@UzZ5%ZqPDp2B31e>tVp2L{>$ z+0497-TT>hn--s(63nqennwUl0<~+yywp5fuUSwE&&L=EuR45QqHAsS^R_?_3_-#e zt89n*i>qSa>i5bkr*xJ0pR%+3RI~N#*DW$D6D;jz-!@Tsh#U9mybRA#EcY z;dmG6dpwFt=i44rKiYjicJ(Z7%9Pphb;c0<%Ah9pJX=xH^zf%+^*pj&BGqu4N$y*G zEl8jyKCgD6yy;~JhhK)>pJ6k5J?v^{Bv2FgiDAyBA6||TfPF9ZKfWqx12sv~DE9aj zFPE9@-$4vP?+w(%UjrUrN$fVtuN<3@u>by#Uk1|rDtn=HdB`_EZ9+ZLiT_9;EtgiP zj95WSY%f^*-41<3$zng$3hlRAFeI#oLd~Bpr!d}+tT-frj?G!dej4_q&A6Z6cbw7YU<{2m{9c`v-F6MqW*0KcnA$l@4$-hGD|AmDq}h{vk)L+Ep``V()%MuLf*R}K|)tS4gbB7vINle|c8A)03t?MK$JVhDO~ zpeDYp=WBP-FXHSwy!k-l2A`cAzNd)gBT>`Rd5v-&k^ zC`(E^d{|Hl`>0pE_TAzjpA_TK0N=Bnr>QdV)o{HR#SkRAdmN(4c>^h2Ct9taB?oq# zEQ%%^v0w=Lfplzfi1yD3r1yG@Dx5P!^Bf;--Rzy!bNjV@G;RNQBGxr2AD@EBKZ&yN z{M<8YA5}azh4$+NdSAlksLZE8eXNF3NVB(k-L>-V0uw~X&0!WS10+xr zuVvK8s%gD?h^=`SSl;$eB>(ck^qfly31bQ72)XH+^-XR)R%iohBN36WhZ3{RaiR+2 ziylJ8ST#5so}e{yyw!+4K1iS@KBHKrTY^XX@_MXp9o$Amra1hF-WHCfSsD4(8BP=W z7x9bfe#MoC=N#h_^!LHBuM>MTS7VO?`}~u=EJOw6=uyW=A48h5_s%5t-nq&36*cjB zoYF_)&sTMfGLS$I5u|yXcyyA|{)prCI`mdY0yXj3zSBjOg0CGTOAJBZbJWE1D5r=9 zGjF_2u+N0i-y8|l#680glTx|+VZH8R2>PC*CLYN=@1=C2>wghA!$z7{4RRDxy16^v zKEt^s5@?&(mQwe+KD*2PN!5&2Bv8t@EA#leM`C5Z<@V~_%Z7O^(nca;S_UC5_130s z@Uq}M3gzr#1my?4o7u!5ItAYjB3dC#2g+;^cHcEwo>d z1*MQS&T;Ph&raAizmnej;5P%mYR2!!^1PFkeQ&nt?F0KOBv2ENUc*Nz?@Ddf2@Jt9 zKuvthe;+@QRQ`|L{P=n+5?Go@^J9Whf7I3a{KXS5EPd4ga~f&(hx_EL zO#1EkIwKMFeitq0Te9rmcBFacb+MPo)F6|{)P8p|5~vqxzQyBix;nw?C(QSLH455) zhr+5~we>VrrTQ0tP>LxRwdPh-CG`f)dz5Nhr=LX*Yh2V6;o(?;Jh1vTW!aU3Rybl!K5>3dKHdZxG9)PXK4}kVWvoP!9;@uDB3*9}U1ze}2;Fp-x?IUbY5yzkMq>2$ zBI=8(L0ZA-&CM8sHh#CbPZMJ^P$#y>ZwYnoYjTcnr`s4b?i!8B``y-pt(QJ}mAuxx zw)N-VXq)$OVvfj7myXmvoSK`AQn68&srS}rwqC5)>A)q*H|Lpcnw}0P_i`q+*MH=%=S6^3Z2>)}6j0;=!6jNLc)iPz|4Tw*B`O*^uTJ?7ufPWvM<*j}^w(`Ti+d z`Te3ED~uugx6iO8T;UBb`*$!t@hsKYnQH6H)?*?sP~D2J^^{{S@GebCP_;7^%1{Y7tofpSfD;>cAlgPCv4d)k8OwR5n0Rcwl$~{ zW(U(=KIK24AmyQxT>~ZzSfL3P-^GhM7nat zrr!;~>3Gr9^8R~>SXTW?@`oRL=+?~yTV2-mq`(2{t;{lJvdz1m$eK zk$TGgLKKQ`an9z#Hjp+FrKdP+!TURF=~45N!c~RN9zUz65a}v;6v{mPyzQH9Ea%nK z=52*(Z4vFv=aC2LNeo5ZkGC~q8$*9?rz<5+>-S8I=HH+Bw>^FQmg#`k>aU<&qQj7S zS{|2pN^E=Gc5G*at(JQNmFRrk=5u+Tt@_ji;wxlq0TpL4QM=z`H72Tya9$s)w)uLP zzJ_13(-8=ezW6j zCOsX`+f5J$-mX^r7H~CV%B!1WXua5Fd%$I$HZqn{XC>KE__ri=a(!-nT4uW3bND2! z)S5%|$?dM~_mnV0%4^qEsC%i0wz}o)dG+IPike_8B-XudXdp1Pm~T99d<-JaW?q(|6{gqFBX z-qwAiykNmV1A$Ucsvf2$Vb5%%o<_2bA}@NVFVp?R*I7^1C483T!mwMm4_Y5~4pQoK0(`>^z<)yzJr_~+5+M@Y) z<&7t(S%c^Q-pSG9QHVHF_oGLq)bzx(T_@;7?WeXroIfb#7I=d4yid3F*8APq!5gjp z7f%o`axPWZ{5VdpMtrjsPC9LfNr_e`sPLY2TfdyoI955Q9#AKJ7$fe*9B>cvy+m89 zXCV6*XU?MwRO~{!tq1E(Eqm9Y$@FarVwqcwVtQ9tG?-D2|gth*hl-7{9PW}_|aj^ zU6ewaziNBFBb6<2q42@B|e!9Ug2H8&;OH!6B zy~U$E+&&_IS_=)aQu%kjw3S1e4^E|&3FWDK(wh{e^+{S^yBuZXl4XzI#mm+14tBYZb|Kq?D<>(oX>m$lea?n7uUU3+lT)j0RV(fqB_32iM`gFUkYCZuHt!xM zXy@QEG_w0;1I??>t}W!W_HpV!8et&N#@(3nRCi%HemDFaw-1-B59Fjw?X-psPs$jA z1jd#}`j(IKu;`}Rm529K48gc#j_@gnMrY){y=!U(T9(%4c8MeBcMIv^?nbtmyxZ68 zUIhJIU&~hY=q|eSGLp`htI4tYm~zt7^U@H{D?Nk7Ej5PvN6jax*GIi(+~u0_J@HLS z8rPT>Tw_l1Z=Mgb_d~vTKdnKD{I2&;?4=Dk#_IQ$VqJQ`|KG&_x6`~1m%36u-SLK+ zC!m)$yZSDw_h}J*iu#m-_KMDkCfmt{l(_6B6D^x;m%YZgYrda~83>fx8?}R0ty@aZ z4j*7*%$A>WfoAo!@!?LwOWQ$3hA*Wqfgvfy(xNDf5=qhF>_OKkhJ5BPpgKNPnNW8A zkhg{UYr`up@{;%d5@(f@3AZj+H1lP zOp`I?sZ11Q;?S931A(Q9w8Tg6bBkLc9kpuXGOHMOB(PSpSMiOEqEUu!np)bdVh9q( zx;yoYDmQtWPjd+{8)|#m1F@9zcR1zZ!_BCPUw0goOX~+n6&W%-YejgY4%t z&0qudVjl8{ENGS5u1#eT)T5pucd2PV^xS_wJqNo6NX?+j5h8sdmvw&(?px{ z^qY)QQ+#5nabg6yrZ=@=U&*Ji-wO5728(>Q#4tnO-YLUzD(qa58cscD_%iU_J6z@! zxfFX$h*nUlSdfK=X7-_;T*r>JwNlyIUi5rgCazZx?)_1(mh%EMGYz~qGg#^+d524pjTegDY{BlPDhuu zXVmkfhl+KbGZt_8)+ZLnATp8qtm$;l5_BK85(Mg}FS6Og1T)?^qtj+?{k{x%FeW zqMm&#g=o=hc2RJHMHE+QqM;0s=J$%C-k6`hbhh@n79z0Bu^xZfxtXRNSV~8Od^sJv z+vU;bmF+BChUZW|aL5D>v9G-YY!*L~r4>b33tL{RD?YnR(Q=yb!S)K-nO-6Air{ z5ntq(Y93NueBM}IAhF{@H2skm(vMs#YzNluq@J%A)7(renW*&XAJw^debM(teglDe zk>(Kqm!O$TFtyD>1w)WH)-8(8onAy+1{`4=4#hj0w^_$JrMqKlD7UZaCN1V570qR=PPlobq2( z3^A0XM|+N|or5}vutNXH*gCOIY{_wmo*kb=-D3)J``ACwUn{iix9ar5YQ_+(V;5HJ zqH5+vG%@WGr{iO{QS!$_57foK`~-%yr5FlcKc9L%zht`=6GzIRh4j6IeN26U`;t7| zmmHfOZ|JWuhDKt|xY6>3RZrBom%RmspbfRcR_f3woW_hh!#2L2sIF$r(n9XqVX{~< zbSHiAUP8;vmux!=MbnF!e5=NQ^ERZ}pL+Fo^=VXNG06H*KH6*txwtK(n3z*GtV>Aq zy3gI^>g=io#QL*M1rjKQwk65zQOa6!za&`f+SiPA6lr5$GPBJi^1P@U+KOx!O%PJKP%jofBsPk|vwpgl<%I;4}> z=$BVq&vDBvCv2ekCpYUp9+rRBQNGA1a_3xFdTs;l*tbdl&HYu^H`Z6)!J<{vUGtwC zYpCblD4l2;u$n4YiPFCeNK4YRPrqExy>{$o?5xQv!ejT-a`u7p{*pj@`dBFg|E~6a z85KIbgPPgb9Hii?RmA$tO|*kW1C!3)N~97eQs^AjZaDsFBHfKop>iB6q929qGrypn$OO1 z``9~%yq9hzXHH@5!7=ot!&Y)-y&3DpP{;5cRA0B@l)I^R^=u{Wo^~e*iMTsk$!SEi zP9V)=>WU*p=Y7Z20~b%2@mq_fhTmPDc=@@S7OJiEbsr>JH`zx^H*C~nIDPa^`V|pH zh4u1yc+Xi`RMT;0bac!vI(#&W8gP7Prf;KqIoIel17pZ=64-+I6n49eu032GXOYo5(ncb`OE#_k>F(l& zOCANKwpZIr`{wgFh0}!g_$>&x3v$7G!?ZsOhbK!V_fY9tF?yL}E*SHwVEGEl)b{I74pMIStyG6?px%KG*~ZuH`v3WE+?><3$4%<1Gr~N~s0-=a*A7sLT5(j1 zHSx{$)juR0nAuKG2Zo^DvF>|l_`o>5t?+L6=0NS;2oKdO<0yj-q%ZY3KqHInruBOJ z*caNul)kWxUK6orkZB!JWDl=*h713#8I41%sG-<6sXoktlsqCFiK%ejD*jx zy$KcPw$jsq?Hmbg^Sp-q`-kfWdA%O1nIVTM;QL`J&(^WW!PxRw?Q^=C^^l*i-EmP; zxR;6JUdG;EUA}Udu2f6Ze;a$B+Xwu_WS&j*8FbKmbFe~Jwpny3w1KvHz2txXLIo0N z18x70IR6M07?L#e5V`oMx;@k+Ni8y*a?d`hiRU>bM7(#sNf%3n)2bZH)#pv_(6=Y^ zsYSQ`>f=+FsN1R)IxR_?cx0KEN0u)`@|lOG-lhW0XX`x!(#DkA&qsabyW8BoSDNYu z+^6FM=IZ?`+GxuEpTz&a{M^LexIA~(*BPdlTVz5hq;Ee=Cg+34i0^aex?A<(Xlup$ zk(SAGLj=Yb>GixTd!f*_f79{b+zJ)=#X+faY~#y;WB(sSp;de7)Nw}$(ng}q>T*iy z-j4nXzf0bsE9mq4V^odfZcN9cGC>{*UqiGJk8YVaKUqOl`Z;W%J)}9WMi%!Raxp|i zZjE-EK7Jh~KCtQWb+xXenm24zoo%3P_9~7$Ca-oGDVA4BNNWFS6>V>GL?>=0ucD4~ zj_3r^d>djl53y@mP0_Xb{3MJO#sq2hXe{ogWE_54Z-b}{31h5+T=Oa+&EozdP%qMa zRwgDzE?H-ksIzNe5~du}gtmF_E|W=2$=pCZ>EEXzN@1GN-hblS*I)A zcu7vlL-pVPLxkG%>c^IJs(mw$9a_%=u77z?`&0X>@B|0X-edTz*pbHM#WPm_FXA4rnjb z!Ue?L7CSvr3TgB&;+t;sbr-R%vI{vO-27(!GdgrEzwU)}#`h^jCKjUBT$)GvJ*Qg5 z@=zQ8ElFF>Nv4n=j?*0P{a#XBhN3i)cj7z(pHNI%Vf}0lYT})S==x&K0F%%TBqgB~ z+AtDN&z91rE^VR3l}k0FjR9?+lT%0 z%LeN8UVeuv2j!>sx{Vq&uE{ias8)8LFzh0uUbH7kXUBbVom(VCFAv;b#{K#SpRdrc zjS@A{cX&U>9G7!`93dioN0>1Lck+KMxJoO3|FPLUF8JQTH5WYtw*`wPPW_WnFA}JU zPu>sNt9;F~T~9ggpQB!+c}CB*u-Avz>Z644Wb|Ug-EiC`m!vi4`ir=LH}Z%gd)?6= z4sCSZevRD2zW&>n+%3OW**_xsuUIwVJ^IY+i|M=U=!M9)*0uW_zvMtQoxl*Zf$8H} z(eNbYa`a7|KCB`5WDD0cj&Kbjc(!d4IV2scA`rUmp^v ziSLdsHchk+@2Q4I%}>U>LIOPmxo__~MtL{camEC#V|f_;6TgSn(p=h_wcQya%vgdb zg*4AU!ke4?W;)KRA%W$LvE}!pa(bEKhB$gr3_-$J6H8oeE8hN7SS&62ISE6sJWvzg z(fE(Isf(w>!xUQ-(rAy{;GmkO=M5ZweMq2GLvH6kr{|{=de2bx&or%6a0|KJ>F{Kf zLVph8lf~NR0~M4) zz4*1`6FgOdRbM7pC_yCf>x?w-pIf8l4GYJKLwmx__@zfFr1=ih z8BV5{+<%WUkj4=XpOta<)+!FGsQHwAnS>z?Jzvq$X@ztzEgVbmy&r{dCRE=tN^emp zg)uP_{)7HWD89DOUj&Zykmmd0CQTKs9uJateGX5?u^JLfgP+sG(mDUFy9@tmZt9z9 zvR;Ddt&X&jcyX?dsmiz>I)N!i0yRm}uhel`iOx~#tN1-;48dGLO}u~Ja*DQf^i(zW zM6d}78++i_V-I}$7!GM(>+^e(P*Cov=M_p}%8f+Y>72?~C&!5@Bx)CaPPY@XQaiSR zH1CGj4iWXLL|Z5A^fP0gpcK+Pca}$s&OMXWnsW1GBv1;^1@M{C;Vpz)rqY_XODQvk zAW_8gDVrPwK z>Z}L!GRJfvjpZasrLqhb)%)I;BUYZUWP9|3wr44-&xCMp`2RD5gjpjJsEJRk^9(hS z*M2^4D`>(H)N4GOQLy!Sd3pZfTA!3VW|YFX8;MH8@5tFN57u(ss%FAmL;^KQQlXP$ zl{>>6V^N%qZi-8%eF=HUmrKn^Z0}lFDdXf=twkFsg*5L?xE5As%y1AGf+dKWc-0`Z zxsv^cv2G@&L*DiiQUowKd42;E!W1Ep}jY$Oi8x~-miH&~2aaK((XZ6r_=`^oIu zqxOsm5Fv{K-EroQw2?T&>m>!aHU|1EQE(QIbqVcB(uwm8#HZP{HJ{)HG7?yik^aBe z88C)O8wp%VK`EqlBGkc!3S5VA>iUC5%=o0QevI$=f#hNb^xu+n=D}2PX|BJT`f^zk zhTy6SuC{QWxIS38IbF3zwffDeN`{NFK$LDOb5pB zzZUExGE6z<57IoNzdTr&THR5H1P<^(Db#BuK4j}JD*3-x+XwVWLIUd&(){W|#r}%F z<~WaoQrNE;iB>}xj9hHOl}4nE z1n*5~xtZ|1n9q#spQ}ecqF2{LsZ)>ss*zX~RL(Q@K~qbwlOY0aAc1S7e5&zB19ijQ zlUDCT(**8X;Qoh^um*0heoW0OPy9Yz;C=)WsEKbp*}K*AS+%Tc-DlGcHc&6dkk=W8 z^wT~heN^8+ooCo%LA^$z`}ICz{@676pJGehQ7^^{_je>|Ql8%0&eV+B-J|Krs0;JW zn7dud&GlUUW3)%xks$)V`beN{Nh0od*~3(v`m|cX5R3_aMS1SrG*GebbDRywGDj(- zCF!u3tmLo0Qg2a6ppMdApLMd!rMq)wU-Xi^EMp516 zS~Avf+$%JepuHyA{dc>+TcV&8?yDM!|K@L~VGj~xi1dHu?Inm(SRVg3fgwoXZZG>l z?sXH7Zq?KtMm+UIDcpB95{HYo7jNGsB4@j;sJTpn^jE%kYf$e$(5j8fgQgI;QhgD7ZxQWfqIeV^R=~3%Ok%J7u!~yHe(19=ncWU`nAY4a6nN# zR%jhPD~z5Tr#dv!MsBaGi6t9M7=k&9n)oc)UZIuSTUFb=xkEA%=q-XY?-gBrpK$)V z!;=H0Fz!aeztmVUKYN^UwVRhQA1mA=2!zH9WKOGO?+`wM0XY9gGR)2>UH{ z3>4Szc&TUJUT%cCkU(!Cet~%FXmM6fR9nTLHl*Aj1s+iBBm7ToQ@Klyx@$-wNTELy z-xapFim8w9P(9^HU<}dAid$6rWIhWJEW1*W8xrUng*n2fOl_?d@2~aryh15Vhmi;^ zSW&bO@z%mFoHnC%B+z?{@0tv1s;z2XNvzEKGzn9Peq?ByUm9OwRw6n&Zt*}V)N3SK z_k5gCD$?=(AQI@ehBW(A*K;#{AK5|AU5pi`$>^)Lsa_r}u6}2+Z~p)@`n{n&gC-Vam zk01I*@|^Qvh&HsnkLSIH!O0kczLn^)$({q>n}``1D{Duqhgp{QSVoDxcF-+81KyDR zP;0OsY9n67*|Tdg=n@BtCF(l-LBdx_PQt@9k)&$5$g(y3Lnw7va|`_LzuMg6)x zwSjjlnDC2(u|nIto>*5l&6+w$&)uv&`%(F3EA*9L_e|rceh|N1!#fzI?oXqie^!v6 zzMEmXdCav=(H%O0Hc+Z->qz>Uv`Ie~!aG0aMy3_!+B$(Dr~a&@M`4@v8|K^ISw(vi zxBPozB%sCyb<3!(VnUB+DyBB8{|x%&yq0nXMA+K24<--KRpeXHey(U?-HU4a+&W@K z!D1Q`yGKl={oPkm-8rHEE3ft+sbCE&u+p<>i4e`H%vAFASWi3ov_0l@#_9g#^Kcn` z-EGfZ)05Vw;?tA$bZk1`gM#B1(>>0U)6)jimPHHn)6$*l4W|J)7m=#xm3PoHtJFJK zeA*bPcyo?=aE`Lij16*K+jWO~`yhAA!Ji=-5-4RX^J!mOYv2176IB~r zkH5+>*}*aS$+|Em7(>1>i-|)_q#quifO?TYO_JpGuA-uhcf4_k1WNVI(4F?bilpCq zI)>MuA_iWarndWYFv072SL*yFf->@54~_VDEB>9A_x>>t`6YoruU*eS8>i5#I$Y+%R%R2yCp&08I(C&&szOXV8u)rH zb-b3*My0z^ZXs3Z<0G_1MOOiHFtw(LF@ZHAmI1 z&HGZx?K6npRkRgL=uXEg22Bnu{cPeRNS+kv}fsTQq1>KTn==kO3h|d`#kr#%(p+c$<@5Ssmn{X6c`fLt2=Eg zI*;OBK1spSMPozzALMW4-j$TK$TPKzY(OxfnZbrSBKSmqd zYUER%v~}Fxih5DXXye4cv3ga?7%P+-$gx_;v8tkbA)T?dO>~(bc-THdMk%yWnA_!t zmSGgW%luq@*>}GWU9tdAxJRc?A_;vYeXoZ~uf{r`N=_TVhau_uo2 z2Zmgov4nQ?UZoRzQ~6ceD(k5U(~{J3-+0aW?s_$?O@Il<2}ob#@xxCZKiE%$O47dF z{=#kLFFECIW;5y)pCV~<{q_27Bt{$0I%QLSg*aX-K)onsw9zL^US+(CqeWo|5*;o? z($ex#|E4_N>$mzO&|e%0h)Kq=&%|@HXyWTNv^!$9joL-h$PAn5R^n+ckH+aCqFctu zW7v%CMhiM-szO;-=okh>TM$qPLV{J&^N}EGVp7D9!-cz}j zY>xOPw`$ozyIfg3iPt%^a2&4I01nn;rZo~c~Wk@)={aHYRPlR!->NhDVhCHvR z6>@s5Vh9o#TVAJrnqT<*Zm4z0nW|z;kTw!EZ%vjDb#AQPtXWFK5VV20AW1u4g=lZ` zCwP>tM)Y1iisRI!#|d0?6(X>rNE;_A`brvoa~Y*%duBu1e3MSctin~CG8b&y!w{=w?;OQmkv z{izb$W6!gBK607s7u4Mo2MP>9;_6HrO`qA3s_Cbf2bQiYe{Ia?0mxrq2ogEQCDWRy z=JdUn{XT$kNBqRo)O7iFU{^Q184U@{5lJd<^AqUZnXYWwx>XRJz~`s8ymh9F_Q9mal#P)UweTgy_zeKIJ8H17$2d8Za%(oYnqKEsOl z$>1F_+X|eaZO>~`GdjUv1Fnf$LEcyEpnfpn{WnM(iE|t)zHLEFEz>vw_2Mlzn1_6t zyg<6z_EQtl_33pPbs=peOrGaer+oEA#}kDG5-7Fo*cs{=TAf<+%?tcWC8wi4r(^V{ zBd(YZq>aS)34U6wk&@=#t+pAx`LS&97C4@H`T1!*mP?vj|D*0mVEH4>zRu(QwCrOf zZTiJvgAHt5Nb{Wo<{nz*S(&tI+cT)xmmq<*`8}2qJ+%|nGH5eZ;+tLXh_dkVbxLA=I3ucF$C8cYVQan+u;@TN?(U7{UgO= z!>|>W7Y{=;48gdgCSL0+TS&Ppg7p%_Ttosj@g9qhSxcT-OY66?m!+u`!e{4~>pN~p z8;Rr3TWV(um(;RNa!JCnMFKVPuD*$HC7SFwn}H#iqo|2zklSjQ@{Jg)w{`L z{>RIL+Hbe^+KpZ@$rysUi<)@7WNNxrZM@|N8m;{33T+Lan1^z8OJ@`#JH;kp>o{2FciP5I7@#v*a9WFTGyj(mGwW$eYwx4R9qD3Dm^znA{2y?zx=QsNVk=(t&G>m?rjO?VL+2iRdE6&!1|= zxZ|27(wq)!plFlZUH-H7KoUyfilC7gvBqpl8|gSphUq{8HSzk@uI8q1TOFt9kU%LM zaqw>VC4cQpzF+EEzm#MQ!SN1ilB8ERdyCc+GKgo%K896i9Pgk#-d&p9+O#pn(FV~5 zN+HefLB4WRrd1!Q*Ak2gjs|eWn^$pqlost=T8OkBR}EtZ)N3R<2bC3KTr<&WPIklU zAQEVgZ+knnS?-m+x;A@H4Gnh}a3#&S8Z}CusEwD$sRIhQ$oS1b0yS|u0;(tW`)G3i znI2-WfnQG4#Qkog@rmx%aK1v?NZ@`8((H?4dEl9OOt2Q?^*kA+a6bx19Q+#8(@n1X z|IE<)L>y%xfqP++l(mZ-yGf-rl^i*zNW3n0d9dVx%cb7S@d^8V_ zF(uS_U#A=PIgvn3ys~}T+hpDC*l|Z)7!%yV`Wf zA4ZzbVAc4l(%?qo;m>p#LvXJdcd+?h=Z=-d5v_^n=)Kzwts`wD9^2eanaXt4^9pMN z<`rs^q-3XG^2T%iVs^QS9vFgpQIjOi@AOdi-!e#as<>A{DcmJB63HJWaiz4Ma9$K( z*hNMfca-@gQb1~?NE|(#M?FyJxJ>PaX&8b8`Zh?CZ^aJc&VT~q*}kk+ zj1@}ZPCSnQ>iLTLQh8B#U^5F6Xb)*FLECsmReLM;wG1S1S0DGh*|*l_sma%?Yk_mt z8hlu=-5H5)UQ@*{b*Q}O-Xah5Bf++fEsebNT4RJ?awlp3WS*Teiz#ZwkY%vlcXjHLPYmxJ3acWtD_)+Qt0)@@7<+M7hCR>ltXT0v|tFP7BzAE z@SG}MCk>U){Mc^g`q$@f zJp0_C6y~UrSU)>R#LUj6Hn_3R18tx$pV4=)?1U;x`+rvGy(osDJ=DZ`<=<6Yc$HK8 z^YU#n5@-Y02Ke@iJ4G#h`<^hrV?Rrrxg%{P(r*-SySt!<#s8O)Kz~T2*}wf??@#X) zixiZ?xik7)vhPQ|nx^Sa4v%>B#ziTl`J~0Ks-{KOmU?Z+)FOeJBx&g^A5rvXdF{&g zw`NQs(ni8FLpE{dW_N8?-+>kkL9bcV#Hag3y8Q8_pEksIh#3j=Z$_GTm&(S;p*6S5 zAHMW6_&Otj^LD-iV%KuH{g(rB{hR|01nNbazXp_1dtASs$WSGNhN}j+wt&9Fk`ysz zu;_UCu9_pcoCW8#IExP$zJ%t^-uCb9#zS~UzwWAIMvwDwq>V)NUb#$}7diY(a2}5S z=ICe5`%%S8nY3N2^)km0oC%{QNs?cBn#v6r{uhB|V_cINJ3tccr}=5Uz2+pM4fGyI znr9Q2Kg-Y0^wlyrhk9TL62|g4b2r6v=eZm5#_fX*KHIo*XIzt+AD>x1SFNa6SiY5^ z%&}$|iIO=Rh(f)d$YtB-*3deZAksWnYga`yx!PF!)nc6oN}&(Eu>^ky7gk1ecAOc- zGDj(-`BX|mx>_sMPaHlOnS>>UG~SIZNtr_`DQ%J)@|6~$0zHy|xZe{RU8DpMWx3JE+zfi&NL6};_Q3}t07>OQ# zva4fu1Zl0iZ8Rf+=VOrOvzA9a#rezC#o|lF%or<7Io^lPcbM+2XnOwnuAUCGfwYl$ zFuJ3ui0P@TJ+JWO3(`j7>SZ36bS&)IE3k1AhTvV^s7aFE?2b~-WjUnSXDqmri#wP| z^Iqzo7Ru$Ej+O1mtE;K*qB#BDYs??xt=T6QL?@igGGE`}MFQ_3N1A6vyZb1gn{L%( zg#@0*L7MLn3O6e*hrD$HPfH?!nt0_dt+!UWNe1yCt$`Wa0TQT*_vq{AFb&B4_sJKe z@kAwmqk=q@)SXZDl;g=l)N71YXt}~l^=O9&HiqC?ZPdiK4%N#nUa#$`l{s481JBVS zftn;~RbEMW?d12i9%XXF5bWns6Ym0ymqfm?e%hOg)lJxwA%U9s^uW1!33+EZ?kdI* z?BP%ox7uT$5=KlM`&XG`i$a=r+-qk!l-~gBdi}3hVGYN2!*3{z=%Y>i@kwpv^^X;$(0{^61h)6rqOSc`SNHf~Mk%E6{RV!= zoxLpHv6sb#|3}wb$5)Xo|KAfJxCReSa28Jv#HOJkxGpXsxI4iK2^!qpC0KAshLD^y z%`_4;cyQN67l$Bu>de{uy`Q=Jd-!Abywd%ys+Q^L>8|ctn(T|Q88DKBb#MC`ecd^~ zgqwLLYDi!t5~S&r5E0FY_)+g+?4C8-DWYHsU-?zJ&Y+xSamE<@lg9*+NkHRJxnC8-z|#|nZ&Ud&btJVzz8l#(@Igw6TQ%eKiK*q`7AL;Flvvr1#89zvp`yRUDCIB9OlBh zvJ!UcCC=NXFUR%QkibYpNSpBoSpy=z78$Q$93;$zw4$6M9iBv}?sY7YnlP#nMmwUr z?kS$v=-;X8rtlTs7~2I2jM_x~s+ybdp4XVoPTsF${1_xqk}F!8^Dc|Yrz30_iwgTO zN}~1lpMU6a#v;{o(Qr%LC9DP1=ZbKYopiL>Kg;rbpg!#RCItBzo< z9a*B~rKgMJ$gs(Vm1yMqLhsX~2YY(^kppvK%rGlKzMP^Rm81Cb9zGcF4r8rh7N>HUH9q^JtVrGyQ2F^#R|yvF&w>1)?mp9eXH6srSd0xN4^SYm<#)o zmH6~FSe&n(s^8M;TY5VZ)_!&QLa^AmK2`s<_H;bT!d&Q6+A&yK zjP8ifCi#UELDB2P_^uurrXXRB)#z6^9V=J0wK$k{kd7%Bw-F`LN|EwKjh@g=#0L$t zBY|%jr0I@dnq@rrovK&uFrp?#kVG0SR1|OKuTHtRRR1_+m?btKzL!uEt@TmK$5P1$ zUkdZa6nyJjN9tA%MT8ygz=V5sOB6ngwu$dxx_Ow|Jdx&bKI6`77#A0FA?cKHD9b9$a_suvnKQ?1%l&FigQWoV9lQ(fles&96Kv7qyfeJ^Qgt z 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�ZY9+G=d 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 Date: Fri, 14 Jul 2017 13:03:43 +0200 Subject: [PATCH 287/379] Improve prime tower position formula again Basically the entire implementation of BuildVolume.py is in here by now... It's a bit more conservative than BuildVolume but I couldn't find a case where this fails (again). --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 18fd6b2c1e..b1127ab446 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -70,7 +70,7 @@ "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "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' 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'))) - 1" }, + "prime_tower_position_y": { "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' 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'))) - sum(extruderValues('skirt_brim_line_width')) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, From 19d9f37bc55c685884c17e014265ca2b007f9d7a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 14 Jul 2017 13:43:05 +0200 Subject: [PATCH 288/379] Also subtract support horizontal expansion from prime tower Y position *&@# --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index b1127ab446..a247ca2aa1 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -70,7 +70,7 @@ "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "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' 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'))) - sum(extruderValues('skirt_brim_line_width')) - 1" }, + "prime_tower_position_y": { "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' 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')) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, "prime_blob_enable": { "enabled": true }, From 7f1dfcf433bde57f6d037e80df674fbda3a76e20 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 14 Jul 2017 15:57:08 +0200 Subject: [PATCH 289/379] Move prime tower more left Otherwise it intersects with one of the clips on some profiles. --- resources/definitions/ultimaker3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index a247ca2aa1..1cbd1fa363 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -69,7 +69,7 @@ "extruder_prime_pos_abs": { "default_value": true }, "machine_start_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" }, - "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_x": { "default_value": 170 }, "prime_tower_position_y": { "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' 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')) - 1" }, "prime_tower_wipe_enabled": { "default_value": false }, From 68989f287192666289002c321d3e22edb6090062 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 17 Jul 2017 11:04:06 +0200 Subject: [PATCH 290/379] Use optional arg in serialize() to exclude network auth keys CURA-4049 --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 15 +++++---------- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 +++++- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 326cd87845..95aac49f55 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -69,7 +69,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): # \param archive The archive to write to. @staticmethod def _writeContainerToArchive(container, archive): - if type(container) == type(ContainerRegistry.getInstance().getEmptyInstanceContainer()): + if isinstance(container, type(ContainerRegistry.getInstance().getEmptyInstanceContainer())): return # Empty file, do nothing. file_suffix = ContainerRegistry.getMimeTypeForContainer(type(container)).preferredSuffix @@ -87,14 +87,9 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): file_in_archive = zipfile.ZipInfo(file_name) # For some reason we have to set the compress type of each file as well (it doesn't keep the type of the entire archive) file_in_archive.compress_type = zipfile.ZIP_DEFLATED - if type(container) == ContainerStack and (container.getMetaDataEntry("network_authentication_id") or container.getMetaDataEntry("network_authentication_key")): - # TODO: Hack - # Create a shallow copy of the container, so we can filter out the network auth (if any) - container_copy = copy.deepcopy(container) - container_copy.removeMetaDataEntry("network_authentication_id") - container_copy.removeMetaDataEntry("network_authentication_key") - serialized_data = container_copy.serialize() - else: - serialized_data = container.serialize() + + # Do not include the network authentication keys + ignore_keys = ["network_authentication_id", "network_authentication_key"] + serialized_data = container.serialize(ignore_metadata_keys = ignore_keys) archive.writestr(file_in_archive, serialized_data) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 7f41fac0c5..a124284cac 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -109,7 +109,7 @@ class XmlMaterialProfile(InstanceContainer): ## Overridden from InstanceContainer # base file: common settings + supported machines # machine / variant combination: only changes for itself. - def serialize(self): + def serialize(self, ignore_metadata_keys=[]): registry = ContainerRegistry.getInstance() base_file = self.getMetaDataEntry("base_file", "") @@ -129,6 +129,10 @@ class XmlMaterialProfile(InstanceContainer): builder.start("metadata") metadata = copy.deepcopy(self.getMetaData()) + # remove the keys that we want to ignore in the metadata + for key in ignore_metadata_keys: + if key in metadata: + del metadata[key] properties = metadata.pop("properties", {}) # Metadata properties that should not be serialized. From 99b236c8d48e730df7a85f32fef8746c00029ec1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 17 Jul 2017 11:08:31 +0200 Subject: [PATCH 291/379] Removed "fix" that caused project files to create new instances if there was no conflict. The overriding doesn't make any sense. The original commit mentions that it should fix something, but it doesn't acutally fix it. It seems the original issue was fixed in the proper place, leaving this code to mess everything up. CURA-3756 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 4d668b17ac..7afdf74b2e 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -305,9 +305,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # In this case, you can either create a new one, or safely override the existing one. # # Default values - for k, v in self._resolve_strategies.items(): - if v is None: - self._resolve_strategies[k] = "new" return WorkspaceReader.PreReadResult.accepted From afe5f568626888cdc09bd919cea69c2a696d844e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 17 Jul 2017 11:44:54 +0200 Subject: [PATCH 292/379] If a default color is used, the layer view now correctly uses it. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 15cda75eb8..c5d7515e98 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -24,6 +24,7 @@ from cura import LayerPolygon import numpy from time import time +from cura.Settings.ExtrudersModel import ExtrudersModel catalog = i18nCatalog("cura") @@ -174,7 +175,11 @@ class ProcessSlicedLayersJob(Job): material_color_map = numpy.zeros((len(extruders), 4), dtype=numpy.float32) for extruder in extruders: position = int(extruder.getMetaDataEntry("position", default="0")) # Get the position - color_code = extruder.material.getMetaDataEntry("color_code", default="#e0e000") + try: + default_color = ExtrudersModel.defaultColors[position] + except KeyError: + default_color = "#e0e000" + color_code = extruder.material.getMetaDataEntry("color_code", default=default_color) color = colorCodeToRGBA(color_code) material_color_map[position, :] = color else: From e6ce98b36d36801fb96c00395c70f45d27e21e56 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 17 Jul 2017 13:00:14 +0200 Subject: [PATCH 293/379] Make machine_nozzle_offset is not None before using it CURA-4053 --- cura/BuildVolume.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index ea3e9265dc..e65756f181 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -746,7 +746,12 @@ class BuildVolume(SceneNode): #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") - other_offset_y = -other_extruder.getProperty("machine_nozzle_offset_y", "value") + if other_offset_x is None: + other_offset_x = 0 + other_offset_y = other_extruder.getProperty("machine_nozzle_offset_y", "value") + if other_offset_y is None: + other_offset_y = 0 + other_offset_y = -other_offset_y left_unreachable_border = min(left_unreachable_border, other_offset_x - offset_x) right_unreachable_border = max(right_unreachable_border, other_offset_x - offset_x) top_unreachable_border = min(top_unreachable_border, other_offset_y - offset_y) From 63b71b86615d30a97e029a99ede793319c59cc5f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 17 Jul 2017 13:39:03 +0200 Subject: [PATCH 294/379] Fix typo in comments --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index a124284cac..6fdd2cd387 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -424,7 +424,7 @@ class XmlMaterialProfile(InstanceContainer): meta_data = {} meta_data["type"] = "material" meta_data["base_file"] = self.id - meta_data["status"] = "unknown" # TODO: Add material verfication + meta_data["status"] = "unknown" # TODO: Add material verification common_setting_values = {} From ecdf0bbe331b988a7c322680cfa21b584a2fd16b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 17 Jul 2017 13:40:10 +0200 Subject: [PATCH 295/379] Fix setting_version in metadata for XMLMaterial CURA-4053 --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 6fdd2cd387..fba43806b0 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -433,10 +433,12 @@ class XmlMaterialProfile(InstanceContainer): inherited = self._resolveInheritance(inherits.text) data = self._mergeXML(inherited, data) + # set setting_version in metadata if "version" in data.attrib: meta_data["setting_version"] = self.xmlVersionToSettingVersion(data.attrib["version"]) else: meta_data["setting_version"] = self.xmlVersionToSettingVersion("1.2") #1.2 and lower didn't have that version number there yet. + metadata = data.iterfind("./um:metadata/*", self.__namespaces) for entry in metadata: tag_name = _tag_without_namespace(entry) @@ -455,6 +457,11 @@ class XmlMaterialProfile(InstanceContainer): meta_data["material"] = material.text meta_data["color_name"] = color.text continue + + # setting_version is derived from the "version" tag in the schema earlier, so don't set it here + if tag_name == "setting_version": + continue + meta_data[tag_name] = entry.text if tag_name in self.__material_metadata_setting_map: From 3c663d576cb0469398917abf3510eb34739b796e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 17 Jul 2017 13:54:20 +0200 Subject: [PATCH 296/379] Do not save setting_version when serializing an XML material CURA-4053 setting_version is derived from the "version" tag in the XML material schema. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index fba43806b0..da04ed7dc9 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -129,6 +129,8 @@ class XmlMaterialProfile(InstanceContainer): builder.start("metadata") metadata = copy.deepcopy(self.getMetaData()) + # setting_version is derived from the "version" tag in the schema, so don't serialize it into a file + ignore_metadata_keys = ignore_metadata_keys + ["setting_version"] # remove the keys that we want to ignore in the metadata for key in ignore_metadata_keys: if key in metadata: From 6fc824abd5cd66454dd026497ab88f2eaf271da3 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 17 Jul 2017 14:45:48 +0200 Subject: [PATCH 297/379] fix: make line width factor layer 0 an extruder setting (CURA-4027) --- resources/definitions/fdmprinter.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 7fadae3b7c..dca938854a 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -833,7 +833,8 @@ "unit": "%", "default_value": 100.0, "minimum_value": "0.001", - "settable_per_mesh": true + "settable_per_mesh": false, + "settable_per_extruder": true } } } From 4754fd51ad09b33c436d0ac0bba34975c3438268 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Sat, 1 Jul 2017 18:22:52 +0200 Subject: [PATCH 298/379] feat: topmost skin: Roofing settings (CURA-3940) --- resources/definitions/fdmprinter.def.json | 97 +++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index dca938854a..c2f281574b 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -699,6 +699,20 @@ } } }, + "topmost_skin_line_width": + { + "label": "Roofing Line Width", + "description": "Width of a single line of the areas at the top of the print.", + "unit": "mm", + "minimum_value": "0.001", + "minimum_value_warning": "0.1 + 0.4 * machine_nozzle_size", + "maximum_value_warning": "2 * machine_nozzle_size", + "default_value": 0.4, + "type": "float", + "value": "line_width", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, "skin_line_width": { "label": "Top/Bottom Line Width", @@ -932,6 +946,46 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, + "topmost_skin_extruder_nr": + { + "label": "Roofing Extruder", + "description": "The extruder train used for printing the top most skin. This is used in multi-extrusion.", + "type": "optional_extruder", + "default_value": "-1", + "value": "-1", + "settable_per_mesh": true, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, + "enabled": "machine_extruder_count > 1" + }, + "topmost_skin_layer_count": + { + "label": "Roofing Layers", + "description": "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces.", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "top_layers - 1", + "type": "int", + "value": "0 if infill_sparse_density == 100 else 1", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, + "topmost_skin_pattern": + { + "label": "Roofing Pattern", + "description": "The pattern of the top most layers.", + "type": "enum", + "options": + { + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "lines", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, "top_bottom_extruder_nr": { "label": "Top/Bottom Extruder", @@ -2010,6 +2064,20 @@ } } }, + "speed_topmost_skin": + { + "label": "Roofing Speed", + "description": "The speed at which roofing layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "default_value": 25, + "value": "speed_print / 60 * 25", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, "speed_topbottom": { "label": "Top/Bottom Speed", @@ -2350,6 +2418,21 @@ } } }, + "acceleration_topmost_skin": + { + "label": "Roofing Acceleration", + "description": "The acceleration with which roofing layers are printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_print", + "enabled": "resolveOrValue('acceleration_enabled')", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, "acceleration_topbottom": { "label": "Top/Bottom Acceleration", @@ -2639,6 +2722,20 @@ } } }, + "jerk_topmost_skin": + { + "label": "Roofing Jerk", + "description": "The maximum instantaneous velocity change with which roofing layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_print", + "enabled": "resolveOrValue('jerk_enabled')", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, "jerk_topbottom": { "label": "Top/Bottom Jerk", From c91d11fde31ba45bb699b7c359fbded473c6056d Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Sat, 1 Jul 2017 18:23:19 +0200 Subject: [PATCH 299/379] fix: make ironing inherit from topmost_skin rather than top_bottom (CURA-3940) --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c2f281574b..60c5225cc0 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2099,7 +2099,7 @@ "type": "float", "unit": "mm/s", "default_value": 20.0, - "value": "speed_topbottom * 20 / 30", + "value": "speed_topmost_skin * 20 / 30", "minimum_value": "0.001", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "100", @@ -2458,7 +2458,7 @@ "minimum_value_warning": "100", "maximum_value_warning": "10000", "default_value": 3000, - "value": "acceleration_topbottom", + "value": "acceleration_topmost_skin", "enabled": "resolveOrValue('acceleration_enabled') and ironing_enabled", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true @@ -2759,7 +2759,7 @@ "minimum_value": "0.1", "maximum_value_warning": "50", "default_value": 20, - "value": "jerk_topbottom", + "value": "jerk_topmost_skin", "enabled": "resolveOrValue('jerk_enabled') and ironing_enabled", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true From 89cafc867eeb27a281159d8638e87e1a87c66c91 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 14 Jul 2017 14:46:10 +0200 Subject: [PATCH 300/379] cleanup: remove superfluous value equal to default_value (CURA-3940) --- 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 60c5225cc0..dcd3284b36 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -868,7 +868,6 @@ "description": "The extruder train used for printing the walls. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", - "value": "-1", "settable_per_mesh": true, "settable_per_extruder": false, "settable_per_meshgroup": true, @@ -952,7 +951,6 @@ "description": "The extruder train used for printing the top most skin. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", - "value": "-1", "settable_per_mesh": true, "settable_per_extruder": false, "settable_per_meshgroup": true, @@ -992,7 +990,6 @@ "description": "The extruder train used for printing the top and bottom skin. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", - "value": "-1", "settable_per_mesh": true, "settable_per_extruder": false, "settable_per_meshgroup": true, @@ -1298,7 +1295,6 @@ "description": "The extruder train used for printing infill. This is used in multi-extrusion.", "type": "optional_extruder", "default_value": "-1", - "value": "-1", "settable_per_mesh": true, "settable_per_extruder": false, "settable_per_meshgroup": true, From 7b56ba41b1f77605b3d42f73010cd6b1a9d2aad3 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 14 Jul 2017 14:53:28 +0200 Subject: [PATCH 301/379] fix: topmost_skin_extruder_nr enabled function (CURA-3940) --- 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 dcd3284b36..4ba269679e 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -955,7 +955,7 @@ "settable_per_extruder": false, "settable_per_meshgroup": true, "settable_globally": true, - "enabled": "machine_extruder_count > 1" + "enabled": "machine_extruder_count > 1 and topmost_skin_layer_count > 0 and top_layers > 0" }, "topmost_skin_layer_count": { From 9dcb2c918ee50194a4c3bb0b81e2eae5128bb070 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 14 Jul 2017 14:54:48 +0200 Subject: [PATCH 302/379] fix: disable topmost skin settings if there is no top skin (CURA-3940) --- resources/definitions/fdmprinter.def.json | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4ba269679e..537093bf51 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -711,7 +711,8 @@ "type": "float", "value": "line_width", "limit_to_extruder": "topmost_skin_extruder_nr", - "settable_per_mesh": true + "settable_per_mesh": true, + "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" }, "skin_line_width": { @@ -967,7 +968,8 @@ "type": "int", "value": "0 if infill_sparse_density == 100 else 1", "limit_to_extruder": "topmost_skin_extruder_nr", - "settable_per_mesh": true + "settable_per_mesh": true, + "enabled": "top_layers > 0" }, "topmost_skin_pattern": { @@ -982,7 +984,8 @@ }, "default_value": "lines", "limit_to_extruder": "topmost_skin_extruder_nr", - "settable_per_mesh": true + "settable_per_mesh": true, + "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" }, "top_bottom_extruder_nr": { @@ -2072,7 +2075,8 @@ "default_value": 25, "value": "speed_print / 60 * 25", "limit_to_extruder": "topmost_skin_extruder_nr", - "settable_per_mesh": true + "settable_per_mesh": true, + "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" }, "speed_topbottom": { @@ -2425,7 +2429,7 @@ "maximum_value_warning": "10000", "default_value": 3000, "value": "acceleration_print", - "enabled": "resolveOrValue('acceleration_enabled')", + "enabled": "resolveOrValue('acceleration_enabled') and topmost_skin_layer_count > 0 and top_layers > 0", "limit_to_extruder": "topmost_skin_extruder_nr", "settable_per_mesh": true }, @@ -2728,7 +2732,7 @@ "maximum_value_warning": "50", "default_value": 20, "value": "jerk_print", - "enabled": "resolveOrValue('jerk_enabled')", + "enabled": "resolveOrValue('jerk_enabled') and topmost_skin_layer_count > 0 and top_layers > 0", "limit_to_extruder": "topmost_skin_extruder_nr", "settable_per_mesh": true }, From 26ac70d2bd80593614d63bb0cb506b68127b35ea Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 17 Jul 2017 15:16:11 +0200 Subject: [PATCH 303/379] feat: topmost_skin_angles (CURA-3940) --- resources/definitions/fdmprinter.def.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 537093bf51..0854d34305 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -987,6 +987,16 @@ "settable_per_mesh": true, "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" }, + "topmost_skin_angles": + { + "label": "Roofing Line Directions", + "description": "A list of integer line directions to use when the roofing layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", + "type": "[int]", + "default_value": "[ ]", + "enabled": "topmost_skin_pattern != 'concentric'", + "limit_to_extruder": "topmost_skin_extruder_nr", + "settable_per_mesh": true + }, "top_bottom_extruder_nr": { "label": "Top/Bottom Extruder", From 141543d7ca897caaa9305955a6c9bd6f5936776e Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 17 Jul 2017 15:32:57 +0200 Subject: [PATCH 304/379] don't enable roofing by default (CURA-3940) --- 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 0854d34305..98122e9879 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -962,7 +962,7 @@ { "label": "Roofing Layers", "description": "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces.", - "default_value": 1, + "default_value": 0, "minimum_value": "0", "maximum_value_warning": "top_layers - 1", "type": "int", From 83f6dec28d703d586f33f399de5c14c68a78f31e Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 17 Jul 2017 15:51:36 +0200 Subject: [PATCH 305/379] rename roofing settings: topmost_skin => roofing (CURA-3940) --- resources/definitions/fdmprinter.def.json | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 98122e9879..4f0cf3b04a 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -699,7 +699,7 @@ } } }, - "topmost_skin_line_width": + "roofing_line_width": { "label": "Roofing Line Width", "description": "Width of a single line of the areas at the top of the print.", @@ -710,9 +710,9 @@ "default_value": 0.4, "type": "float", "value": "line_width", - "limit_to_extruder": "topmost_skin_extruder_nr", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, - "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" + "enabled": "roofing_layer_count > 0 and top_layers > 0" }, "skin_line_width": { @@ -946,7 +946,7 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, - "topmost_skin_extruder_nr": + "roofing_extruder_nr": { "label": "Roofing Extruder", "description": "The extruder train used for printing the top most skin. This is used in multi-extrusion.", @@ -956,9 +956,9 @@ "settable_per_extruder": false, "settable_per_meshgroup": true, "settable_globally": true, - "enabled": "machine_extruder_count > 1 and topmost_skin_layer_count > 0 and top_layers > 0" + "enabled": "machine_extruder_count > 1 and roofing_layer_count > 0 and top_layers > 0" }, - "topmost_skin_layer_count": + "roofing_layer_count": { "label": "Roofing Layers", "description": "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces.", @@ -967,11 +967,11 @@ "maximum_value_warning": "top_layers - 1", "type": "int", "value": "0 if infill_sparse_density == 100 else 1", - "limit_to_extruder": "topmost_skin_extruder_nr", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, "enabled": "top_layers > 0" }, - "topmost_skin_pattern": + "roofing_pattern": { "label": "Roofing Pattern", "description": "The pattern of the top most layers.", @@ -983,18 +983,18 @@ "zigzag": "Zig Zag" }, "default_value": "lines", - "limit_to_extruder": "topmost_skin_extruder_nr", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, - "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" + "enabled": "roofing_layer_count > 0 and top_layers > 0" }, - "topmost_skin_angles": + "roofing_angles": { "label": "Roofing Line Directions", "description": "A list of integer line directions to use when the roofing layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", "type": "[int]", "default_value": "[ ]", - "enabled": "topmost_skin_pattern != 'concentric'", - "limit_to_extruder": "topmost_skin_extruder_nr", + "enabled": "roofing_pattern != 'concentric'", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true }, "top_bottom_extruder_nr": @@ -2073,7 +2073,7 @@ } } }, - "speed_topmost_skin": + "speed_roofing": { "label": "Roofing Speed", "description": "The speed at which roofing layers are printed.", @@ -2084,9 +2084,9 @@ "maximum_value_warning": "150", "default_value": 25, "value": "speed_print / 60 * 25", - "limit_to_extruder": "topmost_skin_extruder_nr", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, - "enabled": "topmost_skin_layer_count > 0 and top_layers > 0" + "enabled": "roofing_layer_count > 0 and top_layers > 0" }, "speed_topbottom": { @@ -2109,7 +2109,7 @@ "type": "float", "unit": "mm/s", "default_value": 20.0, - "value": "speed_topmost_skin * 20 / 30", + "value": "speed_roofing * 20 / 30", "minimum_value": "0.001", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "100", @@ -2428,7 +2428,7 @@ } } }, - "acceleration_topmost_skin": + "acceleration_roofing": { "label": "Roofing Acceleration", "description": "The acceleration with which roofing layers are printed.", @@ -2439,8 +2439,8 @@ "maximum_value_warning": "10000", "default_value": 3000, "value": "acceleration_print", - "enabled": "resolveOrValue('acceleration_enabled') and topmost_skin_layer_count > 0 and top_layers > 0", - "limit_to_extruder": "topmost_skin_extruder_nr", + "enabled": "resolveOrValue('acceleration_enabled') and roofing_layer_count > 0 and top_layers > 0", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true }, "acceleration_topbottom": @@ -2468,7 +2468,7 @@ "minimum_value_warning": "100", "maximum_value_warning": "10000", "default_value": 3000, - "value": "acceleration_topmost_skin", + "value": "acceleration_roofing", "enabled": "resolveOrValue('acceleration_enabled') and ironing_enabled", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true @@ -2732,7 +2732,7 @@ } } }, - "jerk_topmost_skin": + "jerk_roofing": { "label": "Roofing Jerk", "description": "The maximum instantaneous velocity change with which roofing layers are printed.", @@ -2742,8 +2742,8 @@ "maximum_value_warning": "50", "default_value": 20, "value": "jerk_print", - "enabled": "resolveOrValue('jerk_enabled') and topmost_skin_layer_count > 0 and top_layers > 0", - "limit_to_extruder": "topmost_skin_extruder_nr", + "enabled": "resolveOrValue('jerk_enabled') and roofing_layer_count > 0 and top_layers > 0", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true }, "jerk_topbottom": @@ -2769,7 +2769,7 @@ "minimum_value": "0.1", "maximum_value_warning": "50", "default_value": 20, - "value": "jerk_topmost_skin", + "value": "jerk_roofing", "enabled": "resolveOrValue('jerk_enabled') and ironing_enabled", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true From f66bbf0dac5ff9c86ccc00d68ce17447c8b83dd6 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 17 Jul 2017 22:01:43 +0100 Subject: [PATCH 306/379] Fix recently broken setting of gcode area value property setting on focus loss. --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 897fb2a051..40fe09f7df 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -755,7 +755,7 @@ Cura.MachineAction { if(!activeFocus) { - propertyProvider.setPropertyValue("value", gcodeField.text) + propertyProvider.setPropertyValue("value", gcodeArea.text) } } Component.onCompleted: From 024f2384e0c671a4b75ec2dd0dd63f6509082dc0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 18 Jul 2017 08:32:20 +0200 Subject: [PATCH 307/379] Fix mutable arg problem and rename arg CURA-4049 --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 2 +- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 95aac49f55..f805936ab5 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -90,6 +90,6 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): # Do not include the network authentication keys ignore_keys = ["network_authentication_id", "network_authentication_key"] - serialized_data = container.serialize(ignore_metadata_keys = ignore_keys) + serialized_data = container.serialize(ignored_metadata_keys = ignore_keys) archive.writestr(file_in_archive, serialized_data) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index da04ed7dc9..f920a6bd49 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -3,7 +3,7 @@ import copy import io -from typing import Optional +from typing import List, Optional import xml.etree.ElementTree as ET from UM.Resources import Resources @@ -109,7 +109,7 @@ class XmlMaterialProfile(InstanceContainer): ## Overridden from InstanceContainer # base file: common settings + supported machines # machine / variant combination: only changes for itself. - def serialize(self, ignore_metadata_keys=[]): + def serialize(self, ignored_metadata_keys: Optional[List] = None): registry = ContainerRegistry.getInstance() base_file = self.getMetaDataEntry("base_file", "") @@ -130,9 +130,11 @@ class XmlMaterialProfile(InstanceContainer): metadata = copy.deepcopy(self.getMetaData()) # setting_version is derived from the "version" tag in the schema, so don't serialize it into a file - ignore_metadata_keys = ignore_metadata_keys + ["setting_version"] + if ignored_metadata_keys is None: + ignored_metadata_keys = [] + ignored_metadata_keys = ignored_metadata_keys + ["setting_version"] # remove the keys that we want to ignore in the metadata - for key in ignore_metadata_keys: + for key in ignored_metadata_keys: if key in metadata: del metadata[key] properties = metadata.pop("properties", {}) From 18fddf50c70cafdf6e6890e1a9fd19f9aa295ed6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 18 Jul 2017 09:22:45 +0200 Subject: [PATCH 308/379] Add type hinting for container_id in ExtruderStack CURA-4049 --- cura/Settings/ExtruderStack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index e7f57eb4ef..6484692439 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -20,7 +20,7 @@ if TYPE_CHECKING: # # class ExtruderStack(CuraContainerStack): - def __init__(self, container_id, *args, **kwargs): + def __init__(self, container_id: str, *args, **kwargs): super().__init__(container_id, *args, **kwargs) self.addMetaDataEntry("type", "extruder_train") # For backward compatibility From 794a0e806c727784be62b712b574b3a157725d56 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Jul 2017 10:38:12 +0200 Subject: [PATCH 309/379] Add Polish translations Courtsey of @jagus85 and the guys over at reprapy.pl. These files are either directly copied from the e-mail (cura.po) or first converted from .mo to .po files and then copied (.def.json.po files). They have not been finalised yet. In particular their metadata is quite wrong, so I'll do that next. Contributes to issue CURA-3998. --- resources/i18n/pl/cura.po | 3541 +++++++++++++++ resources/i18n/pl/fdmextruder.def.json.po | 174 + resources/i18n/pl/fdmprinter.def.json.po | 4917 +++++++++++++++++++++ 3 files changed, 8632 insertions(+) create mode 100644 resources/i18n/pl/cura.po create mode 100644 resources/i18n/pl/fdmextruder.def.json.po create mode 100644 resources/i18n/pl/fdmprinter.def.json.po diff --git a/resources/i18n/pl/cura.po b/resources/i18n/pl/cura.po new file mode 100644 index 0000000000..9d6261e634 --- /dev/null +++ b/resources/i18n/pl/cura.po @@ -0,0 +1,3541 @@ +# English translations for PACKAGE package. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-30 15:32+0200\n" +"PO-Revision-Date: 2017-07-13 15:58+0200\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pl_PL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.2\n" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/__init__.py:12 +msgctxt "@label" +msgid "Machine Settings action" +msgstr "Czynność ustawienia drukarki" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" +msgstr "Zapewnia sposób zmiany ustawień maszyn (takich jak objętość robocza, rozmiar dyszy itd.)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:28 +msgctxt "@action" +msgid "Machine Settings" +msgstr "Ustawienia drukarki" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@label" +msgid "X-Ray View" +msgstr "Widok rentgenowski" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides the X-Ray view." +msgstr "Zapewnia widok rentgenowski " + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:19 +msgctxt "@item:inlistbox" +msgid "X-Ray" +msgstr "Prześwietlenie" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:11 +msgctxt "@label" +msgid "X3D Reader" +msgstr "Czytnik X3D" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:14 +msgctxt "@info:whatsthis" +msgid "Provides support for reading X3D files." +msgstr "Zapewnia obsługę czytania plików X3D" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:20 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "X3D Plik" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:12 +msgctxt "@label" +msgid "GCode Writer" +msgstr "GCode Autor" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Writes GCode to a file." +msgstr "Zapisuje kod GCode do pliku" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "Plik GCode " + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:13 +msgctxt "@label" +msgid "Doodle3D" +msgstr "Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "Akceptuje kod G i wysyła je przez WiFi do Doodle3D WiFi-Box." + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:36 +msgctxt "@item:inmenu" +msgid "Doodle3D printing" +msgstr "Doodle3D drukowanie" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:37 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print with Doodle3D" +msgstr "Drukuj z Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:38 +msgctxt "@info:tooltip" +msgid "Print with " +msgstr "Drukuj z" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:49 +msgctxt "@title:menu" +msgid "Doodle3D" +msgstr "Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:50 +msgctxt "@item:inlistbox" +msgid "Enable Scan devices..." +msgstr "Włącz skanowanie urządzeń ..." + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/__init__.py:12 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "Dziennik" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Shows changes since latest checked version." +msgstr "Pokazuje zmiany od ostatniej sprawdzonej wersji." + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "Pokaż Dziennik" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/__init__.py:12 +msgctxt "@label" +msgid "Profile flatener" +msgstr "Charakterystyka Profila" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Create a flattend quality changes profile." +msgstr "Utwórz profil charakterystyczny profil jakości" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "Spłaszczyć aktywne ustawienia" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "Profil został spłaszczony i aktywowany." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/__init__.py:13 +msgctxt "@label" +msgid "USB printing" +msgstr "Drukowanie USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "Akceptuje kod G i wysyła je do drukarki. Wtyczka może również aktualizować oprogramowanie układowe." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "Drukowanie USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "Drukuj przez USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "Drukuj przez USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "Połączono przez USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka jest zajęta lub nie jest podłączona." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "Ta drukarka nie obsługuje drukowania USB, ponieważ wykorzystuje smak UltiGCode." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer does not support usb printing." +msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka nie obsługuje drukowania USB." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:107 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "Nie można zaktualizować oprogramowania, ponieważ nie ma podłączonych drukarek." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:121 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "Nie znaleziono oprogramowania wymaganego dla drukarki w% s." + +#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 +msgctxt "X3G Writer Plugin Description" +msgid "Writes X3G to a file" +msgstr "Zapisuje plik X3G" + +#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:22 +msgctxt "X3G Writer File Description" +msgid "X3G File" +msgstr "Plik X3G " + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "Zapisz na dysk wymienny" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "Zapisz na dysk wymienny {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress" +msgid "Saving to Removable Drive {0}" +msgstr "Zapisywanie na dysk wymienny {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to {0}: {1}" +msgstr "Nie udało się zapisać do {0}: {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "Zapisano na dysk wymienny {0} as {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:133 +msgctxt "@action:button" +msgid "Eject" +msgstr "Wyjmij" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:133 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "Wyjmij urządzenie wymienne {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:138 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "Nie można zapisać na wymiennym dysku {0}: {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:148 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "Wyjęto {0}. Teraz można bezpiecznie wyjąć napęd" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:150 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "Nie można wysunąć {0}. Inny program może używać dysku." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/__init__.py:12 +msgctxt "@label" +msgid "Removable Drive Output Device Plugin" +msgstr "Usuwana wtyczka urządzenia wyjściowego napędu" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/__init__.py:14 +msgctxt "@info:whatsthis" +msgid "Provides removable drive hotplugging and writing support." +msgstr "Zapewnia podłączanie wymiennego dysku i zapisywania na bieżąco." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:69 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "Dysk wymienny" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13 +msgctxt "@info:whatsthis" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "Zarządza połączeniami sieciowymi z drukarkami Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:106 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "Drukowanie przez sieć" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "Drukowanie przez sieć" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:156 +msgctxt "@info:status" +msgid "Access to the printer requested. Please approve the request on the printer" +msgstr "Wymagany dostęp do drukarki. Proszę zatwierdzić prośbę na drukarce" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +msgctxt "@action:button" +msgid "Retry" +msgstr "Spróbuj ponownie" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "Prześlij ponownie żądanie dostępu" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "Dostęp do drukarki został zaakceptowany" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "Brak dostępu do tej drukarki. Nie można wysłać zadania drukowania." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "Poproś o dostęp" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "Wyślij żądanie dostępu do drukarki" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:348 +msgctxt "@info:status" +msgid "Connected over the network. Please approve the access request on the printer." +msgstr "Połączono przez sieć. Proszę zatwierdzić żądanie dostępu na drukarce." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:355 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "Połączono przez sieć." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:368 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "Połączono przez sieć. Brak dostępu do sterowania drukarką." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:373 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "Żądanie dostępu zostało odrzucone na drukarce." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:376 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "Żądanie dostępu nie powiodło się z powodu limitu czasu." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:440 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "Połączenie z siecią zostało utracone." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:471 +msgctxt "@info:status" +msgid "The connection with the printer was lost. Check your printer to see if it is connected." +msgstr "Połączenie z drukarką zostało utracone. Sprawdź, czy drukarka jest podłączona." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:620 +#, python-format +msgctxt "@info:status" +msgid "Unable to start a new print job, printer is busy. Current printer status is %s." +msgstr "Nie można uruchomić nowego zadania drukowania, drukarka jest zajęta. Aktualny stan drukarki to% s." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:644 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "Nie można uruchomić nowego zadania drukowania. Brak atrybutu druku w pamięci {0}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:651 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "Nie można uruchomić nowego zadania drukowania. Brak materiału w szczelinie {0}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:660 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "Nie ma wystarczającej ilości materiału na szpulę {0}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:670 +#, python-brace-format +msgctxt "@label" +msgid "Different print core (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "Różne rdzenie drukowania (Cura: {0}, Drukarka: {1}) wybrane dla dyszy {2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:684 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "Różne materiały (Cura: {0}, Drukarka: {1}) wybrane do dzyszy {2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#, python-brace-format +msgctxt "@label" +msgid "Print core {0} is not properly calibrated. XY calibration needs to be performed on the printer." +msgstr "Rdzeń wydruku {0} nie jest poprawnie skalibrowane. Kalibracja XY musi być przeprowadzona na drukarce." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:697 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "Czy na pewno chcesz drukować z wybraną konfiguracją?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:698 +msgctxt "@label" +msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "Występuje niezgodność między konfiguracją lub kalibracją drukarki a drukarką Cura. Aby uzyskać najlepszy rezultat, zawsze wycinaj rdzenie druku i materiały włożone do drukarki." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:704 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "Niedopasowana konfiguracja" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:805 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "Wysyłanie danych do drukarki" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:806 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:46 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:73 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +msgctxt "@action:button" +msgid "Cancel" +msgstr "Anuluj" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "Nie można wysłać danych do drukarki. Czy inna praca jest nadal aktywna?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1008 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "Przerwij drukowanie ..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1014 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "Wydruk został przerwany. Sprawdź drukarkę" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1020 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "Wstrzymaj drukowanie ..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1022 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "Wznawianie drukowania ..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1165 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "Synchronizuj się z drukarką" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1167 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "Czy chcesz używać bieżącej konfiguracji drukarki w programie Cura?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1169 +msgctxt "@label" +msgid "The print cores and/or materials on your printer differ from those within your current project. For the best result, always slice for the print cores and materials that are inserted in your printer." +msgstr "Rdzenie druku i / lub materiały na drukarce różnią się od rdzeni w bieżącym projekcie. Aby uzyskać najlepszy rezultat, zawsze wycinaj rdzenie i materiały drukowane w drukarce." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Połącz przez sieć" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +msgid "Modify G-Code" +msgstr "Modyfikować G-Code" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12 +msgctxt "@label" +msgid "Post Processing" +msgstr "Przetwarzanie " + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16 +msgctxt "Description of plugin" +msgid "Extension that allows for user created scripts for post processing" +msgstr "Rozszerzenie, które pozwala tworzyć skrypty dla użytkowników po przetworzeniu" + +#: /home/ruben/Projects/Cura/plugins/AutoSave/__init__.py:12 +msgctxt "@label" +msgid "Auto Save" +msgstr "Automatyczne zapisywanie" + +#: /home/ruben/Projects/Cura/plugins/AutoSave/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "Automatycznie zapisuje ustawienia, maszyny i profile po zmianach." + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/__init__.py:10 +msgctxt "@label" +msgid "Slice info" +msgstr "Cura informacja" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/__init__.py:13 +msgctxt "@info:whatsthis" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "Składa anonimową listę cięc. Można wyłączyć przez preferencje." + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:75 +msgctxt "@info" +msgid "Cura collects anonymised slicing statistics. You can disable this in preferences" +msgstr "Cura zbiera anonimowe statystyki krojenia. Możesz wyłączyć to w preferencjach" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:76 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "Oddalić" + +#: /home/ruben/Projects/Cura/plugins/XmlMaterialProfile/__init__.py:18 +msgctxt "@label" +msgid "Material Profiles" +msgstr "Profile materiałów" + +#: /home/ruben/Projects/Cura/plugins/XmlMaterialProfile/__init__.py:21 +msgctxt "@info:whatsthis" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "Zapewnia możliwość odczytu i zapisu profili materiałów opartych na XML." + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:12 +msgctxt "@label" +msgid "Legacy Cura Profile Reader" +msgstr "Starszy czytnik Cura" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "Zapewnia obsługę importowania profili w starszych wersjach Cura." + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Profile Cura 15.04 " + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:12 +msgctxt "@label" +msgid "GCode Profile Reader" +msgstr "Czytnik profilu GCode" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for importing profiles from g-code files." +msgstr "Zapewnia obsługę importowania profili z plików g-code." + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:21 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "Pliki G-code " + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@label" +msgid "Layer View" +msgstr "Widok warstwy" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:16 +msgctxt "@info:whatsthis" +msgid "Provides the Layer view." +msgstr "Zapewnia widok warstwy." + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:20 +msgctxt "@item:inlistbox" +msgid "Layers" +msgstr "Warstwy" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura nie wyświetla dokładnie warstw podczas drukowania druków" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py:14 +msgctxt "@label" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "Aktualizacja wersji 2.5 do 2.6" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "Uaktualnia konfiguracje z Cura 2.5 do Cura 2.6." + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py:14 +msgctxt "@label" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "Aktualizacja wersji 2.1 do 2.2" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "Uaktualnia konfiguracje z Cura 2.1 do Cura 2.2." + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py:14 +msgctxt "@label" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "Aktualizacja wersji 2.2 do 2.4" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "Uaktualnia konfiguracje z Cura 2.2 do Cura 2.4." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:12 +msgctxt "@label" +msgid "Image Reader" +msgstr "Czytnik Obrazów" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "Umożliwia generowanie drukowanej geometrii z plików obrazów 2D." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "Obraz JPG" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:25 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "Obraz JPEG" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:29 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "Obraz PNG " + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "Obraz BMP " + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:37 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "Obraz GIF " + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:105 +msgctxt "@info:status" +msgid "The selected material is incompatible with the selected machine or configuration." +msgstr "Wybrany materiał jest niezgodny z wybranym urządzeniem lub konfiguracją." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice with the current settings. The following settings have errors: {0}" +msgstr "Nie można wyciąć z bieżącymi ustawieniami. Następujące ustawienia mają błędy: {0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:308 +msgctxt "@info:status" +msgid "Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "Nie można rozłożyć, ponieważ pierwsza wieża lub pierwsze (i) pozycje są nieważne." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +msgctxt "@info:status" +msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." +msgstr "Nic się nie pokroić, ponieważ żaden z modeli nie pasuje do objętości kompilacji. Prosimy o skalowanie lub obracanie modeli do siebie dopasowanych." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/__init__.py:13 +msgctxt "@label" +msgid "CuraEngine Backend" +msgstr "CuraEngine Backend" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "Zapewnia link do narzędzia krojenia CuraEngine." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:64 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "Przetwarzanie warstw" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings Tool" +msgstr "Narzędzie ustawień każdego modelu" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Provides the Per Model Settings." +msgstr "Zapewnia ustawienia modelu w modelu." + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:21 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "W każdym modelu" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:22 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "Konfiguruj ustawienia modelu" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:643 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "Zalecane" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:648 +msgctxt "@title:tab" +msgid "Custom" +msgstr "Niestandardowe" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:27 +msgctxt "@label" +msgid "3MF Reader" +msgstr "Czytnik 3MF" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +msgctxt "@info:whatsthis" +msgid "Provides support for reading 3MF files." +msgstr "Zapewnia obsługę czytania plików 3MF." + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:38 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:44 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "Plik 3MF " + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:119 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1047 +msgctxt "@label" +msgid "Nozzle" +msgstr "Dysza" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@label" +msgid "Solid View" +msgstr "Widol siatki" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides a normal solid mesh view." +msgstr "Zapewnia normalny widok siatki." + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:19 +msgctxt "@item:inmenu" +msgid "Solid" +msgstr "Siatka" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:12 +msgctxt "@label" +msgid "G-code Reader" +msgstr "Czytnik G-kodu" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Allows loading and displaying G-code files." +msgstr "Umożliwia ładowanie i wyświetlanie plików kodu G-code" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:25 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "Plik G-kod" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "Analizowanie G-kodu" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:365 +msgctxt "@info:generic" +msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." +msgstr "Przed wysłaniem pliku upewnij się, że G-kod jest odpowiedni do konfiguracji drukarki. Przedstawienie G-kodu może nie być dokładne." + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:12 +msgctxt "@label" +msgid "Cura Profile Writer" +msgstr "Profile Cura3d" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for exporting Cura profiles." +msgstr "Zapewnia obsługę eksportowania profili CURA." + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Cura Profile" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:19 +msgctxt "@label" +msgid "3MF Writer" +msgstr "3MF Writer" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:22 +msgctxt "@info:whatsthis" +msgid "Provides support for writing 3MF files." +msgstr "Zapewnia obsługę pisania plików 3MF." + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "Pliki 3MF " + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:39 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "Plik Cura Project 3MF" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:20 +msgctxt "@action" +msgid "Select upgrades" +msgstr "Wybierz aktualizacje" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/__init__.py:16 +msgctxt "@label" +msgid "Ultimaker machine actions" +msgstr "Działania Ultimakera" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/__init__.py:19 +msgctxt "@info:whatsthis" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" +msgstr "Zapewnia działanie maszyny Ultimaker (takie jak kreator wyrównywania łóżka, wybierania ulepszeń itd.)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "Uaktualnij oprogramowanie firmowe" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "Sprawdzanie" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "Płyta kompaktowa" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:12 +msgctxt "@label" +msgid "Cura Profile Reader" +msgstr "Czytnik profilu Cura" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for importing Cura profiles." +msgstr "Zapewnia wsparcie dla importowania profili Cura." + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:247 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "Plik w plasterkach {0}" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:376 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "Nie załadowano materiału" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:383 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "Nieznany materiał" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Znajdowanie nowej lokalizacji obiektów" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:85 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Nie można znaleźć lokalizacji w obrębie woluminu kompilacji dla wszystkich obiektów" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:355 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "Plik już istnieje" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:356 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#, python-brace-format +msgctxt "@label" +msgid "The file {0} already exists. Are you sure you want to overwrite it?" +msgstr "Plik {0} już istnieje. Czy na pewno chcesz go nadpisać?" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:739 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:740 +msgctxt "@label" +msgid "Custom" +msgstr "Niestandardowy" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:741 +msgctxt "@label" +msgid "Custom Material" +msgstr "Niestandardowy materiał" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to export profile to {0}: {1}" +msgstr "Nie można wyeksportować profilu do {0}: {1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:148 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to export profile to {0}: Writer plugin reported failure." +msgstr "Nie można wyeksportować profilu do {0}: Wtyczka Cura zgłosiła błąd." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#, python-brace-format +msgctxt "@info:status" +msgid "Exported profile to {0}" +msgstr "Eksportowany profil do {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:199 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:208 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:242 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to import profile from {0}: {1}" +msgstr "Nie można zaimportować profilu z {0}: {1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:210 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:246 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "Profil importowany {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:249 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "Profil {0} ma nieznany typ pliku lub jest uszkodzony." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:267 +msgctxt "@label" +msgid "Custom profile" +msgstr "Niestandardowy profil" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:278 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "Profil brakuje typu jakości." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:300 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "Nie można znaleźć typu jakości {0} dla bieżącej konfiguracji." + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:95 +msgctxt "@info:status" +msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models." +msgstr "Wysokość woluminu kompresji została zmniejszona ze względu na wartość ustawienia Print Sequence (Sekwencja wydruku), aby zapobiec kolizji z drukowanymi modelami." + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "Mnożenie i umieszczanie przedmiotów" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "Raport awarii" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 +msgctxt "@label" +msgid "" +"